This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.

Try executing this chunk by clicking the Run button within the chunk or by placing your cursor inside it and pressing Cmd+Shift+Enter.

Test Test Test

library(data.table)
library(tidyr)
library(maps)
library(haven)
library(ggplot2)
library(dplyr)

Add a new chunk by clicking the Insert Chunk button on the toolbar or by pressing Cmd+Option+I.

When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the Preview button or press Cmd+Shift+K to preview the HTML file).

The preview shows you a rendered HTML copy of the contents of the editor. Consequently, unlike Knit, Preview does not run any R code chunks. Instead, the output of the chunk when it was last run in the editor is displayed.

<<<<<<< HEAD
library(readxl)
hardship_complete <- read_excel("/Users/cristinacandido/Documents/Github/risk_wvs/data/Hardship_complete.xlsx")
hardship_complete
hardship_complete$mean_homicide=log(hardship_complete$mean_homicide)
hardship_complete$gdp=log(hardship_complete$gdp)
hardship_complete$Infant_mortality=log(hardship_complete$Infant_mortality)
hardship_complete$life_expect=log(hardship_complete$life_expect)
hardship_complete$gini_income=log(hardship_complete$gini_income)
hardship_complete$`primary_ female_ enrollment_ rate`=log(hardship_complete$`primary_ female_ enrollment_ rate`)
hardship_complete

# Reverse Codierung
hardship_complete$mean_homicide=scale(hardship_complete$mean_homicide)
hardship_complete$gdp=scale(-hardship_complete$gdp)
hardship_complete$Infant_mortality=scale(hardship_complete$Infant_mortality)
hardship_complete$life_expect=scale(-hardship_complete$life_expect)
hardship_complete$gini_income=scale(hardship_complete$gini_income)
hardship_complete$gini_income=scale(-hardship_complete$`primary_ female_ enrollment_ rate`)
hardship_complete

hardship_complete$hardship_index=(hardship_complete$mean_homicide+hardship_complete$gdp+hardship_complete$gini_income+hardship_complete$life_expect+hardship_complete$Infant_mortality+hardship_complete$`primary_ female_ enrollment_ rate`)/6

hardship_complete
=======
library(readxl)
hardship_complete <- read_excel("/Users/cristinacandido/Documents/Github/risk_wvs/code/Hardship_complete_2024.xlsx")
hardship_complete
NA
NA
hardship_complete$homiciderate=log(hardship_complete$homiciderate)
hardship_complete$gdp=log(hardship_complete$gdp)
hardship_complete$infantmortality=log(hardship_complete$infantmortality)
hardship_complete$lifeexpectancy=log(hardship_complete$lifeexpectancy)

hardship_complete

# Reverse Codierung
hardship_complete$homiciderate=scale(hardship_complete$homiciderate)
hardship_complete$gdp=scale(-hardship_complete$gdp)
hardship_complete$infantmortality=scale(hardship_complete$infantmortality)
hardship_complete$lifeexpectancy=scale(-hardship_complete$lifeexpectancy)
hardship_complete$gini=scale(hardship_complete$gini)
hardship_complete$femalemale_primedu=scale(-hardship_complete$femalemale_primedu)
hardship_complete

hardship_complete$hardship_index=(hardship_complete$homiciderate+hardship_complete$gdp+hardship_complete$gini+hardship_complete$lifeexpectancy+hardship_complete$infantmortality+hardship_complete$femalemale_primedu)/6

hardship_complete

# Laura added this code
library(dplyr)

# Impute missing values in the hardship indicators using the median
hardship_complete <- hardship_complete %>%
  mutate(across(c("homiciderate", "gdp", "infantmortality", "lifeexpectancy", "gini", "femalemale_primedu"),
                ~ifelse(is.na(.), median(., na.rm = TRUE), .)))

hardship_complete

# Use the mutate function to change the country name
hardship_complete <- hardship_complete %>%
  mutate(country = ifelse(label == "Serbia and Montenegro", "Serbia", label))
hardship_complete
>>>>>>> 4479a7ab7bae21012b85ea8788a321584f71e429
# Data of Wave 5


WV5_data <- readRDS("/Users/cristinacandido/Documents/Github/risk_wvs/data/WVS/F00007944-WV5_Data_R_v20180912.rds")


# Convert WV5_data-object in data.frame 
WV5_data_df <- as.data.frame(WV5_data)

# show first five columns
WV5_data_df
<<<<<<< HEAD =======
>>>>>>> 4479a7ab7bae21012b85ea8788a321584f71e429
#rename the variables
WV5_data <- WV5_data_df %>%
  rename(gender = V235, age = V237, country_code = V2, wave = V1, risktaking = V86, children = V56, married = V55, employed = V241, education = V238)
<<<<<<< HEAD
WV5_data

colnames(WV5_data)



#select only the variables of interest
=======
WV5_data

colnames(WV5_data)
  [1] "wave"          "V1A"           "V1B"           "country_code"  "V2A"           "V3"            "V4"            "V4_CO"         "V5"           
 [10] "V5_CO"         "V6"            "V6_CO"         "V7"            "V7_CO"         "V8"            "V8_CO"         "V9"            "V9_CO"        
 [19] "V10"           "V11"           "V12"           "V13"           "V14"           "V15"           "V16"           "V17"           "V18"          
 [28] "V19"           "V20"           "V21"           "V22"           "V23"           "V24"           "V25"           "V26"           "V27"          
 [37] "V28"           "V29"           "V30"           "V31"           "V32"           "V33"           "V34"           "V35"           "V36"          
 [46] "V37"           "V38"           "V39"           "V40"           "V41"           "V42"           "V43"           "V43_01"        "V43_02"       
 [55] "V43_03"        "V43_04"        "V43_05"        "V43_06"        "V43_07"        "V43_08"        "V43_09"        "V43_10"        "V43_11"       
 [64] "V43_12"        "V43_13"        "V43_14"        "V43_15"        "V43_16"        "V43_17"        "V43_18"        "V43_19"        "V43_20"       
 [73] "V43_21"        "V43_22"        "V43_23"        "V43_24"        "V43_25"        "V43_26"        "V43_27"        "V43_28"        "V43_29"       
 [82] "V43_30"        "V44"           "V45"           "V46"           "V47"           "V48"           "V49"           "V50"           "V51"          
 [91] "V52"           "V53"           "V54"           "married"       "children"      "V57"           "V58"           "V59"           "V60"          
[100] "V61"           "V62"           "V63"           "V64"           "V65"           "V66"           "V67"           "V68"           "V69"          
[109] "V69_HK"        "V70"           "V70_HK"        "V71"           "V72"           "V73"           "V73_HK"        "V74"           "V74_HK"       
[118] "V75"           "V76"           "V77"           "V78"           "V79"           "V80"           "V81"           "V82"           "V83"          
[127] "V84"           "V85"           "risktaking"    "V87"           "V88"           "V89"           "V90"           "V91"           "V92"          
[136] "V93"           "V94"           "V95"           "V96"           "V97"           "V98"           "V99"           "V100"          "V101"         
[145] "V102"          "V103"          "V104"          "V105"          "V106"          "V107"          "V108"          "V109"          "V110"         
[154] "V111"          "V112"          "V113"          "V114"          "V115"          "V116"          "V117"          "V118"          "V119"         
[163] "V120"          "V121"          "V122"          "V123"          "V124"          "V125"          "V126"          "V127"          "V128"         
[172] "V129"          "V130"          "V130_CA_1"     "V130_IQ_1"     "V130_IQ_2"     "V130_IQ_3"     "V130_IQ_4"     "V130_NZ_1"     "V130_NZ_2"    
[181] "V131"          "V132"          "V133"          "V134"          "V135"          "V136"          "V137"          "V138"          "V139"         
[190] "V140"          "V141"          "V142"          "V143"          "V144"          "V145"          "V146_00"       "V146_01"       "V146_02"      
[199] "V146_03"       "V146_04"       "V146_05"       "V146_06"       "V146_07"       "V146_08"       "V146_09"       "V146_10"       "V146_11"      
[208] "V146_12"       "V146_13"       "V146_14"       "V146_15"       "V146_16"       "V146_17"       "V146_18"       "V146_19"       "V146_20"      
[217] "V146_21"       "V146_22"       "V147"          "V148"          "V149"          "V150"          "V151"          "V151_IQ_A"     "V151_IQ_B"    
[226] "V152"          "V153"          "V154"          "V155"          "V156"          "V157"          "V158"          "V159"          "V160"         
[235] "V161"          "V162"          "V163"          "V164"          "V165"          "V166"          "V167"          "V168"          "V169"         
[244] "V170"          "V171"          "V172"          "V173"          "V174"          "V175"          "V176"          "V177"          "V178"         
[253] "V179"          "V180"          "V181"          "V182"          "V183"          "V184"          "V185"          "V186"          "V187"         
[262] "V188"          "V189"          "V190"          "V191"          "V192"          "V193"          "V194"          "V195"          "V196"         
[271] "V197"          "V198"          "V199"          "V200"          "V201"          "V202"          "V203"          "V204"          "V205"         
[280] "V206"          "V207"          "V208"          "V209"          "V210"          "V211"          "V212"          "V213A"         "V213B"        
[289] "V213C"         "V213D"         "V213E"         "V213F"         "V213G"         "V213H"         "V213K"         "V213L"         "V213M"        
[298] "V213N"         "V214"          "V215"          "V216"          "V217"          "V218"          "V219"          "V220"          "V221"         
[307] "V222"          "V223"          "V224"          "V225"          "V226"          "V227"          "V228"          "V229"          "V230"         
[316] "V231"          "V232"          "V233"          "V233A"         "V234"          "gender"        "V236"          "age"           "education"    
[325] "V238CS"        "V239"          "V240"          "employed"      "V242"          "V242A_CO"      "V243"          "V244"          "V245"         
[334] "V246"          "V247"          "V248"          "V249"          "V250"          "V251"          "V252"          "V252B"         "V253"         
[343] "V253CS"        "V254"          "V255"          "V255CS"        "V256"          "V257"          "V257B"         "V257C"         "V258"         
[352] "V259"          "V259A"         "V260"          "V261"          "V262"          "V263"          "V264"          "V265"          "S024"         
[361] "S025"          "Y001"          "Y002"          "Y003"          "SACSECVAL"     "SECVALWGT"     "RESEMAVAL"     "WEIGHTB"       "I_AUTHORITY"  
[370] "I_NATIONALISM" "I_DEVOUT"      "DEFIANCE"      "WEIGHT1A"      "I_RELIGIMP"    "I_RELIGBEL"    "I_RELIGPRAC"   "DISBELIEF"     "WEIGHT2A"     
[379] "I_NORM1"       "I_NORM2"       "I_NORM3"       "RELATIVISM"    "WEIGHT3A"      "I_TRUSTARMY"   "I_TRUSTPOLICE" "I_TRUSTCOURTS" "SCEPTICISM"   
[388] "WEIGHT4A"      "I_INDEP"       "I_IMAGIN"      "I_NONOBED"     "AUTONOMY"      "WEIGHT1B"      "I_WOMJOB"      "I_WOMPOL"      "I_WOMEDU"     
[397] "EQUALITY"      "WEIGHT2B"      "I_HOMOLIB"     "I_ABORTLIB"    "I_DIVORLIB"    "CHOICE"        "WEIGHT3B"      "I_VOICE1"      "I_VOICE2"     
[406] "I_VOI2_00"     "VOICE"         "WEIGHT4B"      "S001"          "S007"          "S018"          "S019"          "S021"          "COW"          
#select only the variables of interest
>>>>>>> 4479a7ab7bae21012b85ea8788a321584f71e429
WV5_data <- WV5_data %>%
  dplyr::select(gender, age, country_code, wave, risktaking, children, married, employed, education)
WV5_data
<<<<<<< HEAD
# Read countrynames data from the CSV file (to decode the dataset 5)
countrynames <- read.csv("/Users/cristinacandido/Documents/Github/risk_wvs/data/WVS/countrynames.txt", header = FALSE, as.is = TRUE)
colnames(countrynames) <- c("code", "name")

# Assuming WV5_data has a column named country_code
WV5_data$country <- countrynames$name[match(WV5_data$country_code, countrynames$code)]

# Check the frequency of each country in the new column
table(WV5_data$country)

# Display the updated WV5_data
print(WV5_data)
=======
>>>>>>> 4479a7ab7bae21012b85ea8788a321584f71e429
#Read Dataset (Wave 6)

WV6_data <- load("/Users/cristinacandido/Documents/Github/risk_wvs/data/WVS/WV6_Data_R_v20201117.rdata") 
WV6_data <- WV6_Data_R_v20201117 
print(WV6_data)
<<<<<<< HEAD =======
#Read Dataset (Wave 6)

WV6_data <- load("/Users/cristinacandido/Documents/Github/risk_wvs/data/WVS/WV6_Data_R_v20201117.rdata") 
WV6_data <- WV6_Data_R_v20201117 
print(WV6_data)
>>>>>>> 4479a7ab7bae21012b85ea8788a321584f71e429
WV6_data <- WV6_data %>%
  rename(wave = V1, gender = V240, age = V242,country_code = V2, risktaking = V76, children = V58, married = V57, employed = V229, education = V248)


#select only the variables of interest

WV6_data <- WV6_data %>%
  dplyr::select(wave, gender, age, country_code,risktaking, children, married, employed, education)
WV6_data
countrynames = read.csv("/Users/cristinacandido/Documents/Github/risk_wvs/data/WVS/countrynames.txt", header=FALSE,as.is=TRUE)
colnames(countrynames) = c("code", "name")
WV6_data$country = countrynames$name [match(WV6_data$country_code, countrynames$code)]
table(WV6_data$country)
WV6_data
<<<<<<< HEAD
WV5_data
WV6_data
WVS_data = rbind(WV5_data, WV6_data)
WVS_data

unique(WVS_data$age)
range(WVS_data$age)
=======

WVS_data = rbind(WV5_data, WV6_data)
WVS_data

country_counts <- WVS_data %>%
  count(country)

# Print the result
print(country_counts)
NA
NA
NA
NA
NA
NA
NA
NA
NA
NA
>>>>>>> 4479a7ab7bae21012b85ea8788a321584f71e429




WVS_data = subset(WVS_data, risktaking > 0 & gender > 0 & age >0 & education > 0 & employed > 0 & married > 0 & children >= 0)
data_Wave5 = subset(WV5_data, risktaking > 0 & gender > 0 & age >0 & education > 0 & employed > 0 & married > 0 & children >= 0)
data_Wave6 = subset(WV6_data, risktaking > 0 & gender > 0 & age >0 & education > 0 & employed > 0 & married > 0 & children >= 0)
WVS_data <- na.omit(WVS_data)
data_Wave5 <- na.omit(data_Wave5)
data_Wave6 <- na.omit(data_Wave6)









# Use the mutate function to change the country name
WVS_data <- WVS_data %>%
  mutate(country = ifelse(country == "Great Britain", "United Kingdom", country))
<<<<<<< HEAD
# Transfrom risk item such that high values represent more risk taking
WVS_data$risktaking = 6 - WVS_data$risktaking + 1

  
# Transform risk variable into T-score (mean = 50, sd = 10)
WVS_data$T_score_risktaking = 10*scale(WVS_data$risktaking, center=TRUE,scale=TRUE)+50

WVS_data

#Transform risk variable into Z score 

# Assuming T-scores have a mean of 50 and a standard deviation of 10
WVS_data$Z_score_risktaking = (WVS_data$T_score_risktaking - 50) / 10

# Print the resulting data frame
print(WVS_data)

WVS_data <- WVS_data %>%
  group_by(country) %>%
  mutate(z_score_age = scale(age))
WVS_data
=======
>>>>>>> 4479a7ab7bae21012b85ea8788a321584f71e429
unique(WVS_data$country)
<<<<<<< HEAD
WVS_mixed_model <- left_join(WVS_data, hardship, by = "country")
WVS_mixed_model
head(WVS_mixed_model)
library(lmerTest)

# intercept only model
model0 = lmer(Z_score_risktaking ~ 1 + (1|country),data = WVS_mixed_model)
summary_model0=summary(model0)
summary_model0
=======
 [1] "Andorra"             "Argentina"           "Australia"           "Brazil"              "Bulgaria"           
 [6] "Burkina Faso"        "Canada"              "Cyprus (G)"          "Chile"               "China"              
[11] "Egypt"               "Ethiopia"            "Finland"             "France"              "Georgia"            
[16] "Germany"             "Ghana"               "Hungary"             "India"               "Indonesia"          
[21] "Iran"                "Japan"               "Malaysia"            "Mali"                "Mexico"             
[26] "Moldova"             "Morocco"             "Netherlands"         "Norway"              "Peru"               
[31] "Poland"              "Romania"             "Russia"              "Rwanda"              "Slovenia"           
[36] "South Africa"        "South Korea"         "Spain"               "Sweden"              "Switzerland"        
[41] "Taiwan"              "Thailand"            "Trinidad and Tobago" "Turkey"              "Ukraine"            
[46] "United Kingdom"      "Uruguay"             "Viet Nam"            "Zambia"              "Algeria"            
[51] "Armenia"             "Azerbaijan"          "Belarus"             "Colombia"            "Ecuador"            
[56] "Estonia"             "Haiti"               "Iraq"                "Jordan"              "Kazakhstan"         
[61] "Kuwait"              "Kyrgyzstan"          "Lebanon"             "Libya"               "New Zealand"        
[66] "Nigeria"             "Pakistan"            "Palestine"           "Philippines"         "Qatar"              
[71] "Singapore"           "Tunisia"             "United States"       "Uzbekistan"          "Yemen"              
[76] "Zimbabwe"           
>>>>>>> 4479a7ab7bae21012b85ea8788a321584f71e429
# age, sex 
model1 = lmer(T_score_risktaking ~ 1 +scale(age)+factor(gender) + (1+scale(age)+factor(gender)|country),data = WVS_mixed_model, control = lmerControl(optimizer = "bobyqa"))
summary_model1=summary(model1)
summary_model1
<<<<<<< HEAD =======
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: T_score_risktaking ~ 1 + scale(age) + factor(gender) + (1 + scale(age) +      factor(gender) | country)
   Data: WVS_mixed_model
Control: lmerControl(optimizer = "bobyqa")

REML criterion at convergence: 1081364

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-2.4737 -0.7821 -0.0770  0.7536  3.2222 

Random effects:
 Groups   Name            Variance Std.Dev. Corr     
 country  (Intercept)      6.6199  2.5729            
          scale(age)       0.7621  0.8730   0.30     
          factor(gender)1  0.8747  0.9353   0.13 0.27
 Residual                 84.6046  9.1981            
Number of obs: 148527, groups:  country, 76

Fixed effects:
                Estimate Std. Error      df t value Pr(>|t|)    
(Intercept)      51.4031     0.2977 75.2144  172.66   <2e-16 ***
scale(age)       -2.0093     0.1042 73.1211  -19.28   <2e-16 ***
factor(gender)1  -2.3174     0.1194 72.3693  -19.41   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) scl(g)
scale(age)  0.291        
fctr(gndr)1 0.072  0.236 
>>>>>>> 4479a7ab7bae21012b85ea8788a321584f71e429
#model 2
library(lme4)

library(lme4)
library(lmerTest)

# Define the lmer model and assign it to 'model_2'
model_2 <- lmer(T_score_risktaking ~ 1 + scale(age) + factor(gender) + factor(children) + 
                 factor(married) + factor(education) + factor(employed) +
                 (1 + scale(age) + factor(gender) + factor(children) + factor(employed) +
                  factor(married) | country),
                data = WVS_mixed_model, control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 100000)))


# Display the summary of the model
summary_model_2 = summary(model_2)
summary_model_2
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: T_score_risktaking ~ 1 + scale(age) + factor(gender) + factor(children) +  
    factor(married) + factor(education) + factor(employed) +  
    (1 + scale(age) + factor(gender) + factor(children) + factor(employed) +          factor(married) | country)
   Data: WVS_mixed_model
Control: lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 1e+05))

REML criterion at convergence: 1079996

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-2.5457 -0.7815 -0.0813  0.7425  3.1678 

Random effects:
 Groups   Name              Variance Std.Dev. Corr                         
 country  (Intercept)        5.4671  2.3382                                
          scale(age)         0.5367  0.7326    0.24                        
          factor(gender)1    0.9298  0.9642    0.03  0.24                  
          factor(children)1  0.7895  0.8885    0.07  0.19  0.11            
          factor(employed)1  0.3133  0.5597    0.04  0.03  0.02 -0.27      
          factor(married)1   0.4120  0.6419    0.22  0.43  0.57  0.20 -0.13
 Residual                   83.7217  9.1500                                
Number of obs: 148527, groups:  country, 76

Fixed effects:
                     Estimate Std. Error         df t value Pr(>|t|)    
(Intercept)         5.204e+01  2.809e-01  8.000e+01 185.238  < 2e-16 ***
scale(age)         -1.478e+00  9.081e-02  7.228e+01 -16.275  < 2e-16 ***
factor(gender)1    -2.171e+00  1.234e-01  7.259e+01 -17.597  < 2e-16 ***
factor(children)1  -1.274e+00  1.284e-01  7.199e+01  -9.920 4.14e-15 ***
factor(married)1   -8.367e-01  9.872e-02  6.267e+01  -8.475 5.49e-12 ***
factor(education)1  7.809e-01  6.489e-02  1.407e+05  12.033  < 2e-16 ***
factor(employed)1   1.056e-01  8.590e-02  7.071e+01   1.229    0.223    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) scl(g) fctr(g)1 fctr(c)1 fctr(mr)1 fctr(d)1
scale(age)   0.224                                            
fctr(gndr)1 -0.022  0.212                                     
fctr(chld)1 -0.016  0.047  0.032                              
fctr(mrrd)1  0.134  0.297  0.409   -0.083                     
fctr(dctn)1 -0.172  0.081  0.013    0.026   -0.013            
fctr(mply)1 -0.029  0.061  0.083   -0.203   -0.099    -0.063  
WVS_mixed_model
NA
NA
# age, sex 
model1 = lmer(T_score_risktaking ~ 1 +scale(age)+factor(gender) + (1+scale(age)+factor(gender)|country),data = WVS_mixed_model, control = lmerControl(optimizer = "bobyqa"))
summary_model1=summary(model1)
summary_model1
<<<<<<< HEAD
model_3 <- lmer(T_score_risktaking ~ 1 + scale(z_score_age) * hardship_index + 
                    factor(gender) * hardship_index + factor(married) + factor(children) + 
                    factor(education) + factor(employed) + 
                    (1 + scale(z_score_age) + factor(married) + factor(children) + 
                     factor(education) + factor(employed) | country),
                data = WVS_mixed_model)

summary(model_3)
=======
model_3 <- lmer(T_score_risktaking ~ 1 + scale(age) * hardship_index + 
                    factor(gender) * hardship_index + factor(married) + factor(children) + 
                    factor(education) + factor(employed) + 
                    (1 + scale(age) + factor(married) + factor(children) + 
                     factor(education) + factor(employed) | country),
                data = WVS_mixed_model,control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 100000)))

summary_model_3 = summary(model_3) 

summary_model_3
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: T_score_risktaking ~ 1 + scale(age) * hardship_index + factor(gender) *  
    hardship_index + factor(married) + factor(children) + factor(education) +  
    factor(employed) + (1 + scale(age) + factor(married) + factor(children) +      factor(education) + factor(employed) | country)
   Data: WVS_mixed_model
Control: lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 1e+05))

REML criterion at convergence: 1080093

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-2.57571 -0.78110 -0.08036  0.74750  3.13409 

Random effects:
 Groups   Name               Variance Std.Dev. Corr                         
 country  (Intercept)         5.5510  2.3561                                
          scale(age)          0.3952  0.6286    0.17                        
          factor(married)1    0.4028  0.6347    0.13  0.13                  
          factor(children)1   0.8063  0.8980    0.09  0.06  0.25            
          factor(education)1  0.6332  0.7957   -0.20  0.03  0.07 -0.13      
          factor(employed)1   0.2881  0.5368    0.00  0.08 -0.29 -0.25  0.16
 Residual                    83.8078  9.1547                                
Number of obs: 148527, groups:  country, 76

Fixed effects:
                                 Estimate Std. Error         df t value Pr(>|t|)    
(Intercept)                     5.204e+01  2.862e-01  7.433e+01 181.838  < 2e-16 ***
scale(age)                     -1.442e+00  8.035e-02  7.109e+01 -17.949  < 2e-16 ***
hardship_index                  4.588e-01  3.840e-01  7.514e+01   1.195    0.236    
factor(gender)1                -2.081e+00  5.032e-02  1.285e+05 -41.359  < 2e-16 ***
factor(married)1               -8.145e-01  9.857e-02  6.114e+01  -8.263 1.53e-11 ***
factor(children)1              -1.302e+00  1.292e-01  7.512e+01 -10.070 1.39e-15 ***
factor(education)1              7.768e-01  1.205e-01  5.044e+01   6.447 4.24e-08 ***
factor(employed)1               1.031e-01  8.357e-02  6.975e+01   1.233    0.222    
scale(age):hardship_index       4.751e-01  1.122e-01  7.216e+01   4.233 6.68e-05 ***
hardship_index:factor(gender)1  5.799e-01  6.902e-02  6.340e+04   8.403  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) scl(g) hrdsh_ fctr(g)1 fctr(mr)1 fctr(c)1 fctr(d)1 fctr(mp)1 sc():_
scale(age)   0.158                                                                    
hardshp_ndx  0.067  0.034                                                             
fctr(gndr)1 -0.098  0.042  0.002                                                      
fctr(mrrd)1  0.066  0.078 -0.005  0.044                                               
fctr(chld)1  0.005 -0.062 -0.003 -0.087   -0.054                                      
fctr(dctn)1 -0.285  0.080  0.014  0.016    0.030    -0.069                            
fctr(mply)1 -0.056  0.095  0.006  0.145   -0.190    -0.186    0.046                   
scl(g):hrd_  0.032  0.091  0.191  0.002   -0.005     0.005   -0.002   -0.035          
hrdshp_:()1 -0.002  0.011 -0.092  0.057   -0.012    -0.006    0.006    0.030     0.023
>>>>>>> 4479a7ab7bae21012b85ea8788a321584f71e429 <<<<<<< HEAD
anova(model0,model1)
anova(model1,model_2)
anova(model_2,model_3) 
=======
random_effects <- ranef(model_2)
random_effects
$country
                    (Intercept)   scale(age) factor(gender)1 factor(children)1 factor(employed)1 factor(married)1
Algeria              1.93351855 -0.854619155      0.87619718      -2.437881334        0.17698875     -0.377226443
Andorra              1.91309921  0.100909057     -0.66981587      -0.632350380        0.20524734     -0.686912835
Argentina           -1.57325789  0.057299092     -0.25780065      -1.067941885       -0.04621841     -0.553872390
Armenia              1.08284389 -0.454274344     -0.89771357      -0.834967062        0.17426467     -0.250770715
Australia           -0.14386428 -0.471375287     -1.06538548      -0.103260090        0.34608388     -0.365152174
Azerbaijan           0.45573171  0.004004243     -2.44218293       0.082693851       -0.21915868     -0.476480146
Belarus             -0.11536490 -1.000016058     -1.08120720      -0.467055853       -0.59713729     -0.046875401
Brazil              -2.84287325  0.262612027     -0.36729059      -0.148830175       -0.34944728     -0.655399532
Bulgaria            -0.77688584 -0.074197571      0.35410308       0.108171529        0.66545761     -0.168532781
Burkina Faso         1.61422833  1.156372503     -0.15049497       0.527033659       -0.25535458      0.423175478
Canada               0.39907784 -0.397232782     -1.02665629      -0.204786757        0.83298979     -0.733722779
Chile                1.03350248 -0.644167015      0.06242265      -1.191152814        0.30273676      0.182724595
China               -2.09375223 -0.445731013      0.50663419      -0.603547862       -0.41625835     -0.223192477
Colombia             0.22689773  0.422663335     -0.91548157      -0.850065668        0.05700229     -0.046926087
Cyprus (G)           2.25496876 -0.776460854     -0.79745197       0.050374871        0.20526698     -0.994122261
Ecuador              2.25294069 -0.040563584      0.75768462       1.082273600       -0.18216772      0.606966414
Egypt               -3.93763995  0.877857068      1.47333952      -0.977664255        0.69617277      0.506927589
Estonia             -1.06399862 -0.805260418     -0.20652339      -0.596528530        0.04115956     -0.263441563
Ethiopia             0.32293567  0.946455342      1.98005066      -0.482906872        1.19465275      0.520837889
Finland             -2.30711075 -0.193362752      0.06835226       0.109995921       -0.09624712     -0.446129133
France              -0.03262671 -0.315869185     -0.97254579      -0.756893462       -0.18841330     -0.721010031
Georgia             -0.34804857  0.313082762     -1.59932353       0.785006390        0.24885966     -0.322662614
Germany             -2.81688356 -0.866667483     -0.56600732      -0.067064088        0.10227997     -0.540483663
Ghana                4.20166977  0.817382387      1.03493510       1.320604468        0.06952553      0.935149120
Haiti               -6.53977492 -1.391127796      1.91289649       1.468940014       -0.89280260      0.533482158
Hungary             -1.99653091 -0.996752173     -0.17049773      -0.160714296        0.07124129     -0.186539589
India                1.43482568  0.617405603      0.45019893       1.836342889       -1.09159157      0.408036403
Indonesia            2.91129285  0.717729512     -0.37251725       0.036310599        0.61487372      0.351255947
Iran                 0.25704414 -0.273465758      0.84529203      -0.730085449        0.58356967     -0.185573571
Iraq                -1.06492016  0.012316662      0.43906584       0.138047194       -0.32549734      0.649008088
Japan               -6.33127212  0.980885912     -0.11206958       0.564989629       -0.44804909     -0.169376931
Jordan               1.80284181 -0.238660302     -0.04733756      -0.275114119        0.13106070      0.079727138
Kazakhstan          -2.61497176  0.099878889      0.38099799      -0.441649153        0.38909549      0.080016173
Kuwait               2.09145419 -1.486900320      0.10785659       0.216244412       -0.71982856     -0.372559647
Kyrgyzstan           0.61067751  1.072544199      1.07198178       0.701056752       -0.33081703      0.900953951
Lebanon              2.84470796 -0.023345343      0.08714121       0.523974067       -0.06162559      0.535210026
Libya                0.80327073 -0.475177836     -0.57060729       0.015373078        0.24676530     -0.259391475
Malaysia            -2.02257329  0.667498135      0.69083376       0.230243197       -0.12134511      0.648213460
Mali                 2.81563100  1.078784421      1.36765639       0.245910074       -0.30999444      1.287801120
Mexico              -0.40013922  0.561817933     -0.55226850      -1.131405064        0.01974498     -0.487453888
Moldova             -1.96423291 -0.329843137      1.07398956      -0.873396236        0.07687739      0.075323668
Morocco              0.68539027  0.249483178     -0.44534432      -0.309370915        0.01082943     -0.178509821
Netherlands         -2.06588418 -0.228085056     -0.89179246       0.412747451       -0.17127304     -0.633635212
New Zealand          0.60732681 -0.774713993      0.04302897      -0.175577939       -0.11512608     -0.279411963
Nigeria              5.59377567  1.275958637      1.62013094       0.389674844        0.37813269      1.361593143
Norway               0.99797819 -0.771979285      0.88446601      -0.045167601       -0.33921268     -0.013483356
Pakistan             4.22659980  1.325790041      0.51442825       0.928501617       -0.97792666      0.666654501
Palestine            0.03194219 -0.494835906     -0.14515969       0.292953341        0.50604479     -0.015691232
Peru                -1.61516779  0.633332407     -0.68009631      -0.717362556       -0.39962778     -0.181622730
Philippines          3.70377389  0.943369150      1.13088110       0.747509770       -0.08964864      0.356984425
Poland               2.19905667  0.037084593     -0.45404816      -0.900087529        0.25558657      0.232224025
Qatar                0.86028228  0.502376889     -0.94153784       0.200394431        0.45200189     -0.086160547
Romania             -2.52089552 -0.155453441     -0.24318156      -0.213424238        0.59038608     -0.046222935
Russia              -0.03564662  0.201433455     -0.04277014       0.338525048        0.55241645     -0.367819701
Rwanda               0.83617515  1.171444046      1.19476510       1.697279263       -0.29018529      0.335814980
Singapore            2.17597132  0.591444549      0.38684581      -0.017294940       -0.08165496      0.363947899
Slovenia             0.21102243 -1.245719908     -0.62662173      -0.617380784        0.28218849     -1.002740221
South Africa         2.37631040  0.311956458      1.26337006       1.080146122        0.68094981      0.751652547
South Korea          1.36893323 -0.405664050      0.80080531       0.341944092       -0.04931702      0.322300385
Spain                0.82809176 -0.466229484      0.62854866      -0.304041861        0.09422269     -0.358645793
Sweden               0.09920433 -0.328664254     -0.47169418      -0.328195601       -0.42679317     -0.438405460
Switzerland         -1.56290696  0.084346338     -1.48036381       0.605515233        0.14178415     -0.884764664
Taiwan              -4.35319381 -0.569177868     -0.09471962      -0.003120567       -0.38488863     -0.220827542
Thailand            -0.09358157  0.844688730      1.30128241       0.253396867       -0.53318528      1.057267847
Trinidad and Tobago  0.24160167 -0.343056024     -0.36770149       1.121472297        0.13881740      0.059010394
Tunisia             -0.42814434 -1.362242692     -0.53278180      -0.600878765       -0.28277064     -0.244015679
Turkey               0.94251912  0.120341608      0.37598170      -0.387346063        0.29373891      0.028586139
Ukraine             -1.58175919 -0.668879956     -0.36649799      -0.519892277        0.26972976     -0.001257245
United Kingdom       1.15668394 -0.030727372     -1.56593196      -0.489635482        0.10560093     -0.751106765
United States       -0.70200525 -0.752298720     -0.40433841       0.416924321        0.25359660     -0.253434481
Uruguay             -3.20629770 -0.108243534      0.34971574      -0.439094936       -0.31919572     -0.167863204
Uzbekistan           1.00109484  0.687012035     -0.28533330       0.716274322        0.20755393      0.141926144
Viet Nam            -3.44301278  0.598580704     -0.35309866       0.622440999       -0.56204886      0.334138408
Yemen               -3.91719513  0.062896576     -0.10339324      -0.646218561       -0.08885691     -0.219935374
Zambia               1.41695079  0.455513249      0.41766478       1.043367849       -0.57988565      1.261564524
Zimbabwe             1.68856739  0.396489975     -1.11595904       0.496697944       -0.32194635     -0.119112532

with conditional variances for “country” 
# Extract random effects for 'country'
# Assuming 'model' is your fitted lmer model
random_effects <- ranef(model_2)
random_effects
colnames(random_effects)
NULL
>>>>>>> 4479a7ab7bae21012b85ea8788a321584f71e429
coefsallmodels=rbind(summary_model1$coefficients,
summary_model_2$coefficients,
summary_model_3$coefficients[c(1:2,4:8,3,9:10),])

write.csv(coefsallmodels,"coefsallmodels.csv")
# Read the CSV file into a data frame
gbd_mentalhealth <- read_excel("/Users/cristinacandido/Documents/Github/risk_wvs/GBD_mentalhealth.xlsx")

gbd_mentalhealth

#select only the variables of interest
gbd_mentalhealth <- gbd_mentalhealth %>%
  dplyr::select(country, gender, age, cause, val, Measure)
gbd_mentalhealth


library(dplyr)

# Group data by country and age group, and calculate summary statistics
summary_by_country_age <- gbd_mentalhealth %>%
  group_by(country, age) %>%
  summarise(
    mean_DALYs = mean(val))  # Calculate mean of DALYs

library(dplyr)

# Assuming 'summary_by_country_age' contains your summarized dataset
mean_by_country <- summary_by_country_age %>%
  group_by(country) %>%
  summarise(mean_DALYs = mean(mean_DALYs))

# View the resulting mean by country
print(mean_by_country)

#log transform
mean_by_country$mean_DALYs=log(mean_by_country$mean_DALYs)
 
mean_by_country 

#Reverse codierung 
mean_by_country$mean_DALYs=scale(mean_by_country$mean_DALYs)

mean_by_country

#rename mean_DALYS
mental_health_index <- mean_by_country %>%
  rename('mental_health' = mean_DALYs)
mental_health_index
library(dplyr)

#######Anxiety disorders#########
#Filter data for a specific mental disorder (e.g., Anxiety Disorders)
anxiety_disorders <- gbd_mentalhealth %>%
  filter(cause == "Anxiety disorders")  # Change "Anxiety Disorders" to the desired disorder

# Calculate the mean of 'val' (Disability-Adjusted Life Years) across locations and ages
mean_DALYs <- mean(anxiety_disorders$val)

# Optionally, if you want to calculate mean by country:
anxiety_disorders <- anxiety_disorders %>%
  group_by(country) %>%
  summarise(mean_Anxiety_disorders = mean(val))

anxiety_disorders

#log transform
anxiety_disorders$mean_Anxiety_disorders=log(anxiety_disorders$mean_Anxiety_disorders)
 
anxiety_disorders

#Reverse codierung 
anxiety_disorders$mean_Anxiety_disorders=scale(anxiety_disorders$mean_Anxiety_disorders)
anxiety_disorders
mental_health_index
gbd_mentalhealth

# Assuming gbd_mentalhealth is your data frame containing the 'cause' column

# Get unique values of 'cause' column
unique_causes <- unique(gbd_mentalhealth$cause)

# Create a data frame with unique causes
cause_table <- data.frame(Cause = unique_causes)

# Print the cause table
print(cause_table)
#######Bulimia nervosa########
library(dplyr)

# Filter the data for 'Bulimia Nervosa'
bulimia_nervosa <- gbd_mentalhealth %>%
  filter(cause == "Bulimia nervosa")

# Calculate the mean of 'val' (DALYs) across all locations
mean_DALYs <- mean(bulimia_nervosa$val)

# Optionally, calculate mean by country
bulimia_nervosa <- bulimia_nervosa %>%
  group_by(country) %>%
  summarise(mean_bulimia_nervosa = mean(val))

# Log transform the mean_bulimia_nervosa column
bulimia_nervosa$mean_bulimia_nervosa <- log(bulimia_nervosa$mean_bulimia_nervosa)

# Scale the mean_bulimia_nervosa column (if needed)
bulimia_nervosa$mean_bulimia_nervosa <- scale(bulimia_nervosa$mean_bulimia_nervosa)

# Print the resulting data frame
print(bulimia_nervosa)
print(anxiety_disorders)

gbd_mentalhealth
#####Attention-deficit/hyperactivity disorder
library(dplyr)


ADHD <- gbd_mentalhealth %>%
  filter(cause == "Attention-deficit/hyperactivity disorder")

# Calculate the mean of 'val' (DALYs) across all locations
mean_DALYs <- mean(ADHD$val)

# Optionally, calculate mean by country
ADHD <- ADHD %>%
  group_by(country) %>%
  summarise(mean_ADHD = mean(val))

# Log transform the mean_bulimia_nervosa column
ADHD$mean_ADHD <- log(ADHD$mean_ADHD)

# Scale the mean_bulimia_nervosa column (if needed)
ADHD$mean_ADHD <- scale(ADHD$mean_ADHD)

# Print the resulting data frame
print(ADHD)
#########Idiopathic development intellectual ability 
library(dplyr)


Idiopathic_developmental_intellectual_disability <- gbd_mentalhealth %>%
  filter(cause == "Idiopathic developmental intellectual disability")

# Calculate the mean of 'val' (DALYs) across all locations
mean_DALYs <- mean(Idiopathic_developmental_intellectual_disability$val)

# Optionally, calculate mean by country
Idiopathic_developmental_intellectual_disability <- Idiopathic_developmental_intellectual_disability %>%
  group_by(country) %>%
  summarise(mean_Idiopathic_developmental_intellectual_disability = mean(val))

# Log transform the mean_bulimia_nervosa column
Idiopathic_developmental_intellectual_disability$mean_Idiopathic_developmental_intellectual_disability <- log(Idiopathic_developmental_intellectual_disability$mean_Idiopathic_developmental_intellectual_disability)

# Scale the mean_bulimia_nervosa column (if needed)
Idiopathic_developmental_intellectual_disability$mean_Idiopathic_developmental_intellectual_disability <- scale(Idiopathic_developmental_intellectual_disability$mean_Idiopathic_developmental_intellectual_disability)

# Print the resulting data frame
print(Idiopathic_developmental_intellectual_disability)
######Anorexia Nervosa

anorexia_nervosa <- gbd_mentalhealth %>%
  filter(cause == "Anorexia nervosa")

# Calculate the mean of 'val' (DALYs) across all locations
mean_DALYs <- mean(anorexia_nervosa$val)

# Optionally, calculate mean by country
anorexia_nervosa <- anorexia_nervosa %>%
  group_by(country) %>%
  summarise(mean_anorexia_nervosa = mean(val))

# Log transform the mean_bulimia_nervosa column
anorexia_nervosa$mean_anorexia_nervosa <- log(anorexia_nervosa$mean_anorexia_nervosa)

# Scale the mean_bulimia_nervosa column (if needed)
anorexia_nervosa$mean_anorexia_nervosa <- scale(anorexia_nervosa$mean_anorexia_nervosa)

# Print the resulting data frame
print(anorexia_nervosa)
#####Depressive disorders#######

depressive_disorders <- gbd_mentalhealth %>%
  filter(cause == "Depressive disorders")

# Calculate the mean of 'val' (DALYs) across all locations
mean_DALYs <- mean(depressive_disorders$val)

# Optionally, calculate mean by country
depressive_disorders <- depressive_disorders %>%
  group_by(country) %>%
  summarise(mean_depressive_disorders = mean(val))

# Log transform the mean_bulimia_nervosa column
depressive_disorders$mean_depressive_disorders <- log(depressive_disorders$mean_depressive_disorders)

# Scale the mean_bulimia_nervosa column (if needed)
depressive_disorders$mean_depressive_disorders <- scale(depressive_disorders$mean_depressive_disorders)

# Print the resulting data frame
print(depressive_disorders)
#######Autismus spectrum disorders######

autismus_spectrum_disorders <- gbd_mentalhealth %>%
  filter(cause == "Autism spectrum disorders")

# Calculate the mean of 'val' (DALYs) across all locations
mean_DALYs <- mean(autismus_spectrum_disorders$val)

# Optionally, calculate mean by country
autismus_spectrum_disorders <- autismus_spectrum_disorders %>%
  group_by(country) %>%
  summarise(mean_autismus_spectrum_disorders = mean(val))

# Log transform the mean_bulimia_nervosa column
autismus_spectrum_disorders$mean_autismus_spectrum_disorders <- log(autismus_spectrum_disorders$mean_autismus_spectrum_disorders)

# Scale the mean_bulimia_nervosa column (if needed)
autismus_spectrum_disorders$mean_autismus_spectrum_disorders <- scale(autismus_spectrum_disorders$mean_autismus_spectrum_disorders)

# Print the resulting data frame
print(autismus_spectrum_disorders)
######Schizophrenia#######
schizophrenia <- gbd_mentalhealth %>%
  filter(cause == "Schizophrenia")

# Calculate the mean of 'val' (DALYs) across all locations
mean_DALYs <- mean(schizophrenia$val)

# Optionally, calculate mean by country
schizophrenia <- schizophrenia %>%
  group_by(country) %>%
  summarise(mean_schizophrenia = mean(val))

# Log transform the mean_bulimia_nervosa column
schizophrenia$mean_schizophrenia <- log(schizophrenia$mean_schizophrenia)

# Scale the mean_bulimia_nervosa column (if needed)
schizophrenia$mean_schizophrenia <- scale(schizophrenia$mean_schizophrenia)

# Print the resulting data frame
print(schizophrenia)
#######Conduct disorders#########
conduct_disorders <- gbd_mentalhealth %>%
  filter(cause == "Conduct disorder")

# Calculate the mean of 'val' (DALYs) across all locations
mean_DALYs <- mean(conduct_disorders$val)

# Optionally, calculate mean by country
conduct_disorders <- conduct_disorders %>%
  group_by(country) %>%
  summarise(mean_conduct_disorders = mean(val))

# Log transform the mean_bulimia_nervosa column
conduct_disorders$mean_conduct_disorders <- log(conduct_disorders$mean_conduct_disorders)

# Scale the mean_bulimia_nervosa column (if needed)
conduct_disorders$mean_conduct_disorders <- scale(conduct_disorders$mean_conduct_disorders)

# Print the resulting data frame
print(conduct_disorders)
########Eating disorders#########
eating_disorders <- gbd_mentalhealth %>%
  filter(cause == "Eating disorders")

# Calculate the mean of 'val' (DALYs) across all locations
mean_DALYs <- mean(eating_disorders$val)

# Optionally, calculate mean by country
eating_disorders <- eating_disorders %>%
  group_by(country) %>%
  summarise(mean_eating_disorders = mean(val))

# Log transform the mean_bulimia_nervosa column
eating_disorders$mean_eating_disorders <- log(eating_disorders$mean_eating_disorders)

# Scale the mean_bulimia_nervosa column (if needed)
eating_disorders$mean_eating_disorders <- scale(eating_disorders$mean_eating_disorders)

# Print the resulting data frame
print(eating_disorders)
########Bipolar disorder#########
bipolar_disorder <- gbd_mentalhealth %>%
  filter(cause == "Bipolar disorder")

# Calculate the mean of 'val' (DALYs) across all locations
mean_DALYs <- mean(bipolar_disorder$val)

# Optionally, calculate mean by country
bipolar_disorder <- bipolar_disorder %>%
  group_by(country) %>%
  summarise(mean_bipolar_disorder = mean(val))

# Log transform the mean_bulimia_nervosa column
bipolar_disorder$mean_bipolar_disorder <- log(bipolar_disorder$mean_bipolar_disorder)

# Scale the mean_bulimia_nervosa column (if needed)
bipolar_disorder$mean_bipolar_disorder <- scale(bipolar_disorder$mean_bipolar_disorder)

# Print the resulting data frame
print(bipolar_disorder)
print(cause_table)
########Substance use disorders########

substance_use_disorders <- gbd_mentalhealth %>%
  filter(cause == "Substance use disorders")

# Calculate the mean of 'val' (DALYs) across all locations
mean_DALYs <- mean(substance_use_disorders$val)

# Optionally, calculate mean by country
substance_use_disorders <- substance_use_disorders %>%
  group_by(country) %>%
  summarise(mean_substance_use_disorders = mean(val))

# Log transform the mean_bulimia_nervosa column
substance_use_disorders$mean_substance_use_disorders <- log(substance_use_disorders$mean_substance_use_disorders)

# Scale the mean_bulimia_nervosa column (if needed)
substance_use_disorders$mean_substance_use_disorders <- scale(substance_use_disorders$mean_substance_use_disorders)

# Print the resulting data frame
print(substance_use_disorders)
####Drug use disorders

drug_use_disorders <- gbd_mentalhealth %>%
  filter(cause == "Drug use disorders")

# Calculate the mean of 'val' (DALYs) across all locations
mean_DALYs <- mean(drug_use_disorders$val)

# Optionally, calculate mean by country
drug_use_disorders <- drug_use_disorders %>%
  group_by(country) %>%
  summarise(mean_drug_use_disorders = mean(val))

# Log transform the mean_bulimia_nervosa column
drug_use_disorders$mean_drug_use_disorders <- log(drug_use_disorders$mean_drug_use_disorders)

# Scale the mean_bulimia_nervosa column (if needed)
drug_use_disorders$mean_drug_use_disorders <- scale(drug_use_disorders$mean_drug_use_disorders)

# Print the resulting data frame
print(drug_use_disorders)
##########Alcohol use disorders
alcohol_use_disorders <- gbd_mentalhealth %>%
  filter(cause == "Alcohol use disorders")

# Calculate the mean of 'val' (DALYs) across all locations
mean_DALYs <- mean(alcohol_use_disorders$val)

# Optionally, calculate mean by country
alcohol_use_disorders <- alcohol_use_disorders %>%
  group_by(country) %>%
  summarise(mean_alcohol_use_disorders = mean(val))

# Log transform the mean_bulimia_nervosa column
alcohol_use_disorders$mean_alcohol_use_disorders <- log(alcohol_use_disorders$mean_alcohol_use_disorders)

# Scale the mean_bulimia_nervosa column (if needed)
alcohol_use_disorders$mean_alcohol_use_disorders <- scale(alcohol_use_disorders$mean_alcohol_use_disorders)

# Print the resulting data frame
print(alcohol_use_disorders)
#######Major depressive disorders
major_depressive_disorder <- gbd_mentalhealth %>%
  filter(cause == "Major depressive disorder")

# Calculate the mean of 'val' (DALYs) across all locations
mean_DALYs <- mean(major_depressive_disorder$val)

# Optionally, calculate mean by country
major_depressive_disorder <- major_depressive_disorder %>%
  group_by(country) %>%
  summarise(mean_major_depressive_disorder = mean(val))

# Log transform the mean_bulimia_nervosa column
major_depressive_disorder$mean_major_depressive_disorder <- log(major_depressive_disorder$mean_major_depressive_disorder)

# Scale the mean_bulimia_nervosa column (if needed)
major_depressive_disorder$mean_major_depressive_disorder <- scale(major_depressive_disorder$mean_major_depressive_disorder)

# Print the resulting data frame
print(major_depressive_disorder)
#######Dysthymia########

dysthymia <- gbd_mentalhealth %>%
  filter(cause == "Dysthymia")

# Calculate the mean of 'val' (DALYs) across all locations
mean_DALYs <- mean(dysthymia$val)

# Optionally, calculate mean by country
dysthymia <- dysthymia %>%
  group_by(country) %>%
  summarise(mean_dysthymia = mean(val))

# Log transform the mean_bulimia_nervosa column
dysthymia$mean_dysthymia <- log(dysthymia$mean_dysthymia)

# Scale the mean_bulimia_nervosa column (if needed)
dysthymia$mean_dysthymia <- scale(dysthymia$mean_dysthymia)

# Print the resulting data frame
print(dysthymia)
library(dplyr)

# Perform left joins for each data frame on 'country'
final_mental_health_index <- mental_health_index %>%
  left_join(bulimia_nervosa, by = "country") %>%
  left_join(ADHD, by = "country") %>%
  left_join(Idiopathic_developmental_intellectual_disability, by = "country") %>%
  left_join(anorexia_nervosa, by = "country") %>%
  left_join(depressive_disorders, by = "country") %>%
  left_join(autismus_spectrum_disorders, by = "country") %>%
  left_join(conduct_disorders, by = "country") %>%
  left_join(schizophrenia, by = "country") %>%
  left_join(eating_disorders, by = "country") %>%
  left_join(bipolar_disorder, by = "country") %>%
  left_join(drug_use_disorders, by = "country") %>%
  left_join(alcohol_use_disorders, by = "country") %>%
  left_join(substance_use_disorders, by = "country") %>%
  left_join(major_depressive_disorder, by = "country") %>%
  left_join(dysthymia, by = "country")

# Display the resulting data frame
print(final_mental_health_index)

# Show the first few rows of the resulting data frame
head(final_mental_health_index)
indicators <- left_join(final_mental_health_index, hardship, by = "country")
indicators
head(indicators)

new_data <- left_join (WVS_data, indicators, by = "country")
new_data


# Transfrom risk item such that high values represent more risk taking
new_data$risktaking = 6 - new_data$risktaking + 1

  
# Transform risk variable into T-score (mean = 50, sd = 10)
new_data$T_score_risktaking = 10*scale(new_data$risktaking, center=TRUE,scale=TRUE)+50

new_data

#Transform risk variable into Z score 

# Assuming T-scores have a mean of 50 and a standard deviation of 10
new_data$Z_score_risktaking = (new_data$T_score_risktaking - 50) / 10

# Print the resulting data frame
print(new_data)

new_data <- new_data %>%
  group_by(country) %>%
  mutate(z_score_age = scale(age))
new_data
<<<<<<< HEAD ======= >>>>>>> 4479a7ab7bae21012b85ea8788a321584f71e429
library(lme4)

library(lme4)

model <- lmer(T_score_risktaking ~ scale(z_score_age) * mental_health +
               gender * mental_health +
               factor(married) + factor(children) +
               factor(education) + factor(employed) +
               (1 + scale(z_score_age) + factor(married) + factor(children) + 
                factor(education) + factor(employed) | country),
<<<<<<< HEAD
             data = new_data)
=======
             data = new_data, control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 100000)))
>>>>>>> 4479a7ab7bae21012b85ea8788a321584f71e429


summary(model)

# Assuming 'model' is a linear mixed-effects model (lmer), and you want to save coefficients to a CSV file

# Extract coefficients from the model summary
coefficients_df <- data.frame(summary(model)$coefficients)

# Write coefficients to a CSV file
write.csv(coefficients_df, "model_coefficients.csv", row.names = TRUE)
<<<<<<< HEAD ======= >>>>>>> 4479a7ab7bae21012b85ea8788a321584f71e429

```

<<<<<<< HEAD
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCmVkaXRvcl9vcHRpb25zOiAKICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lCi0tLQoKVGhpcyBpcyBhbiBbUiBNYXJrZG93bl0oaHR0cDovL3JtYXJrZG93bi5yc3R1ZGlvLmNvbSkgTm90ZWJvb2suIFdoZW4geW91IGV4ZWN1dGUgY29kZSB3aXRoaW4gdGhlIG5vdGVib29rLCB0aGUgcmVzdWx0cyBhcHBlYXIgYmVuZWF0aCB0aGUgY29kZS4gCgpUcnkgZXhlY3V0aW5nIHRoaXMgY2h1bmsgYnkgY2xpY2tpbmcgdGhlICpSdW4qIGJ1dHRvbiB3aXRoaW4gdGhlIGNodW5rIG9yIGJ5IHBsYWNpbmcgeW91ciBjdXJzb3IgaW5zaWRlIGl0IGFuZCBwcmVzc2luZyAqQ21kK1NoaWZ0K0VudGVyKi4KCiMjIFRlc3QgVGVzdCBUZXN0CgpgYGB7cn0KbGlicmFyeShkYXRhLnRhYmxlKQpsaWJyYXJ5KHRpZHlyKQpsaWJyYXJ5KG1hcHMpCmxpYnJhcnkoaGF2ZW4pCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShkcGx5cikKYGBgCgpBZGQgYSBuZXcgY2h1bmsgYnkgY2xpY2tpbmcgdGhlICpJbnNlcnQgQ2h1bmsqIGJ1dHRvbiBvbiB0aGUgdG9vbGJhciBvciBieSBwcmVzc2luZyAqQ21kK09wdGlvbitJKi4KCldoZW4geW91IHNhdmUgdGhlIG5vdGVib29rLCBhbiBIVE1MIGZpbGUgY29udGFpbmluZyB0aGUgY29kZSBhbmQgb3V0cHV0IHdpbGwgYmUgc2F2ZWQgYWxvbmdzaWRlIGl0IChjbGljayB0aGUgKlByZXZpZXcqIGJ1dHRvbiBvciBwcmVzcyAqQ21kK1NoaWZ0K0sqIHRvIHByZXZpZXcgdGhlIEhUTUwgZmlsZSkuIAoKVGhlIHByZXZpZXcgc2hvd3MgeW91IGEgcmVuZGVyZWQgSFRNTCBjb3B5IG9mIHRoZSBjb250ZW50cyBvZiB0aGUgZWRpdG9yLiBDb25zZXF1ZW50bHksIHVubGlrZSAqS25pdCosICpQcmV2aWV3KiBkb2VzIG5vdCBydW4gYW55IFIgY29kZSBjaHVua3MuIEluc3RlYWQsIHRoZSBvdXRwdXQgb2YgdGhlIGNodW5rIHdoZW4gaXQgd2FzIGxhc3QgcnVuIGluIHRoZSBlZGl0b3IgaXMgZGlzcGxheWVkLgoKYGBge3J9CmxpYnJhcnkocmVhZHhsKQpoYXJkc2hpcF9jb21wbGV0ZSA8LSByZWFkX2V4Y2VsKCIvVXNlcnMvY3Jpc3RpbmFjYW5kaWRvL0RvY3VtZW50cy9HaXRodWIvcmlza193dnMvZGF0YS9IYXJkc2hpcF9jb21wbGV0ZS54bHN4IikKaGFyZHNoaXBfY29tcGxldGUKCgpgYGAKYGBge3J9CmhhcmRzaGlwX2NvbXBsZXRlJG1lYW5faG9taWNpZGU9bG9nKGhhcmRzaGlwX2NvbXBsZXRlJG1lYW5faG9taWNpZGUpCmhhcmRzaGlwX2NvbXBsZXRlJGdkcD1sb2coaGFyZHNoaXBfY29tcGxldGUkZ2RwKQpoYXJkc2hpcF9jb21wbGV0ZSRJbmZhbnRfbW9ydGFsaXR5PWxvZyhoYXJkc2hpcF9jb21wbGV0ZSRJbmZhbnRfbW9ydGFsaXR5KQpoYXJkc2hpcF9jb21wbGV0ZSRsaWZlX2V4cGVjdD1sb2coaGFyZHNoaXBfY29tcGxldGUkbGlmZV9leHBlY3QpCmhhcmRzaGlwX2NvbXBsZXRlJGdpbmlfaW5jb21lPWxvZyhoYXJkc2hpcF9jb21wbGV0ZSRnaW5pX2luY29tZSkKaGFyZHNoaXBfY29tcGxldGUkYHByaW1hcnlfIGZlbWFsZV8gZW5yb2xsbWVudF8gcmF0ZWA9bG9nKGhhcmRzaGlwX2NvbXBsZXRlJGBwcmltYXJ5XyBmZW1hbGVfIGVucm9sbG1lbnRfIHJhdGVgKQpoYXJkc2hpcF9jb21wbGV0ZQoKIyBSZXZlcnNlIENvZGllcnVuZwpoYXJkc2hpcF9jb21wbGV0ZSRtZWFuX2hvbWljaWRlPXNjYWxlKGhhcmRzaGlwX2NvbXBsZXRlJG1lYW5faG9taWNpZGUpCmhhcmRzaGlwX2NvbXBsZXRlJGdkcD1zY2FsZSgtaGFyZHNoaXBfY29tcGxldGUkZ2RwKQpoYXJkc2hpcF9jb21wbGV0ZSRJbmZhbnRfbW9ydGFsaXR5PXNjYWxlKGhhcmRzaGlwX2NvbXBsZXRlJEluZmFudF9tb3J0YWxpdHkpCmhhcmRzaGlwX2NvbXBsZXRlJGxpZmVfZXhwZWN0PXNjYWxlKC1oYXJkc2hpcF9jb21wbGV0ZSRsaWZlX2V4cGVjdCkKaGFyZHNoaXBfY29tcGxldGUkZ2luaV9pbmNvbWU9c2NhbGUoaGFyZHNoaXBfY29tcGxldGUkZ2luaV9pbmNvbWUpCmhhcmRzaGlwX2NvbXBsZXRlJGdpbmlfaW5jb21lPXNjYWxlKC1oYXJkc2hpcF9jb21wbGV0ZSRgcHJpbWFyeV8gZmVtYWxlXyBlbnJvbGxtZW50XyByYXRlYCkKaGFyZHNoaXBfY29tcGxldGUKCmhhcmRzaGlwX2NvbXBsZXRlJGhhcmRzaGlwX2luZGV4PShoYXJkc2hpcF9jb21wbGV0ZSRtZWFuX2hvbWljaWRlK2hhcmRzaGlwX2NvbXBsZXRlJGdkcCtoYXJkc2hpcF9jb21wbGV0ZSRnaW5pX2luY29tZStoYXJkc2hpcF9jb21wbGV0ZSRsaWZlX2V4cGVjdCtoYXJkc2hpcF9jb21wbGV0ZSRJbmZhbnRfbW9ydGFsaXR5K2hhcmRzaGlwX2NvbXBsZXRlJGBwcmltYXJ5XyBmZW1hbGVfIGVucm9sbG1lbnRfIHJhdGVgKS82CgpoYXJkc2hpcF9jb21wbGV0ZQoKCmBgYApgYGB7cn0KCiMgRGF0YSBvZiBXYXZlIDUKCgpXVjVfZGF0YSA8LSByZWFkUkRTKCIvVXNlcnMvY3Jpc3RpbmFjYW5kaWRvL0RvY3VtZW50cy9HaXRodWIvcmlza193dnMvZGF0YS9XVlMvRjAwMDA3OTQ0LVdWNV9EYXRhX1JfdjIwMTgwOTEyLnJkcyIpCgoKIyBDb252ZXJ0IFdWNV9kYXRhLW9iamVjdCBpbiBkYXRhLmZyYW1lIApXVjVfZGF0YV9kZiA8LSBhcy5kYXRhLmZyYW1lKFdWNV9kYXRhKQoKIyBzaG93IGZpcnN0IGZpdmUgY29sdW1ucwpXVjVfZGF0YV9kZgpgYGAKCmBgYHtyfQojcmVuYW1lIHRoZSB2YXJpYWJsZXMKV1Y1X2RhdGEgPC0gV1Y1X2RhdGFfZGYgJT4lCiAgcmVuYW1lKGdlbmRlciA9IFYyMzUsIGFnZSA9IFYyMzcsIGNvdW50cnlfY29kZSA9IFYyLCB3YXZlID0gVjEsIHJpc2t0YWtpbmcgPSBWODYsIGNoaWxkcmVuID0gVjU2LCBtYXJyaWVkID0gVjU1LCBlbXBsb3llZCA9IFYyNDEsIGVkdWNhdGlvbiA9IFYyMzgpCldWNV9kYXRhCgpjb2xuYW1lcyhXVjVfZGF0YSkKCgoKI3NlbGVjdCBvbmx5IHRoZSB2YXJpYWJsZXMgb2YgaW50ZXJlc3QKV1Y1X2RhdGEgPC0gV1Y1X2RhdGEgJT4lCiAgZHBseXI6OnNlbGVjdChnZW5kZXIsIGFnZSwgY291bnRyeV9jb2RlLCB3YXZlLCByaXNrdGFraW5nLCBjaGlsZHJlbiwgbWFycmllZCwgZW1wbG95ZWQsIGVkdWNhdGlvbikKV1Y1X2RhdGEKYGBgCmBgYHtyfQojIFJlYWQgY291bnRyeW5hbWVzIGRhdGEgZnJvbSB0aGUgQ1NWIGZpbGUgKHRvIGRlY29kZSB0aGUgZGF0YXNldCA1KQpjb3VudHJ5bmFtZXMgPC0gcmVhZC5jc3YoIi9Vc2Vycy9jcmlzdGluYWNhbmRpZG8vRG9jdW1lbnRzL0dpdGh1Yi9yaXNrX3d2cy9kYXRhL1dWUy9jb3VudHJ5bmFtZXMudHh0IiwgaGVhZGVyID0gRkFMU0UsIGFzLmlzID0gVFJVRSkKY29sbmFtZXMoY291bnRyeW5hbWVzKSA8LSBjKCJjb2RlIiwgIm5hbWUiKQoKIyBBc3N1bWluZyBXVjVfZGF0YSBoYXMgYSBjb2x1bW4gbmFtZWQgY291bnRyeV9jb2RlCldWNV9kYXRhJGNvdW50cnkgPC0gY291bnRyeW5hbWVzJG5hbWVbbWF0Y2goV1Y1X2RhdGEkY291bnRyeV9jb2RlLCBjb3VudHJ5bmFtZXMkY29kZSldCgojIENoZWNrIHRoZSBmcmVxdWVuY3kgb2YgZWFjaCBjb3VudHJ5IGluIHRoZSBuZXcgY29sdW1uCnRhYmxlKFdWNV9kYXRhJGNvdW50cnkpCgojIERpc3BsYXkgdGhlIHVwZGF0ZWQgV1Y1X2RhdGEKcHJpbnQoV1Y1X2RhdGEpCmBgYApgYGB7cn0KI1JlYWQgRGF0YXNldCAoV2F2ZSA2KQoKV1Y2X2RhdGEgPC0gbG9hZCgiL1VzZXJzL2NyaXN0aW5hY2FuZGlkby9Eb2N1bWVudHMvR2l0aHViL3Jpc2tfd3ZzL2RhdGEvV1ZTL1dWNl9EYXRhX1JfdjIwMjAxMTE3LnJkYXRhIikgCldWNl9kYXRhIDwtIFdWNl9EYXRhX1JfdjIwMjAxMTE3IApwcmludChXVjZfZGF0YSkKYGBgCgpgYGB7cn0KV1Y2X2RhdGEgPC0gV1Y2X2RhdGEgJT4lCiAgcmVuYW1lKHdhdmUgPSBWMSwgZ2VuZGVyID0gVjI0MCwgYWdlID0gVjI0Mixjb3VudHJ5X2NvZGUgPSBWMiwgcmlza3Rha2luZyA9IFY3NiwgY2hpbGRyZW4gPSBWNTgsIG1hcnJpZWQgPSBWNTcsIGVtcGxveWVkID0gVjIyOSwgZWR1Y2F0aW9uID0gVjI0OCkKCgojc2VsZWN0IG9ubHkgdGhlIHZhcmlhYmxlcyBvZiBpbnRlcmVzdAoKV1Y2X2RhdGEgPC0gV1Y2X2RhdGEgJT4lCiAgZHBseXI6OnNlbGVjdCh3YXZlLCBnZW5kZXIsIGFnZSwgY291bnRyeV9jb2RlLHJpc2t0YWtpbmcsIGNoaWxkcmVuLCBtYXJyaWVkLCBlbXBsb3llZCwgZWR1Y2F0aW9uKQpXVjZfZGF0YQpgYGAKYGBge3J9CmNvdW50cnluYW1lcyA9IHJlYWQuY3N2KCIvVXNlcnMvY3Jpc3RpbmFjYW5kaWRvL0RvY3VtZW50cy9HaXRodWIvcmlza193dnMvZGF0YS9XVlMvY291bnRyeW5hbWVzLnR4dCIsIGhlYWRlcj1GQUxTRSxhcy5pcz1UUlVFKQpjb2xuYW1lcyhjb3VudHJ5bmFtZXMpID0gYygiY29kZSIsICJuYW1lIikKV1Y2X2RhdGEkY291bnRyeSA9IGNvdW50cnluYW1lcyRuYW1lIFttYXRjaChXVjZfZGF0YSRjb3VudHJ5X2NvZGUsIGNvdW50cnluYW1lcyRjb2RlKV0KdGFibGUoV1Y2X2RhdGEkY291bnRyeSkKV1Y2X2RhdGEKYGBgCmBgYHtyfQpXVjVfZGF0YQpXVjZfZGF0YQpXVlNfZGF0YSA9IHJiaW5kKFdWNV9kYXRhLCBXVjZfZGF0YSkKV1ZTX2RhdGEKCnVuaXF1ZShXVlNfZGF0YSRhZ2UpCnJhbmdlKFdWU19kYXRhJGFnZSkKYGBgCmBgYHtyfQpXVlNfZGF0YSA9IHN1YnNldChXVlNfZGF0YSwgcmlza3Rha2luZyA+IDAgJiBnZW5kZXIgPiAwICYgYWdlID4wICYgZWR1Y2F0aW9uID4gMCAmIGVtcGxveWVkID4gMCAmIG1hcnJpZWQgPiAwICYgY2hpbGRyZW4gPj0gMCkKZGF0YV9XYXZlNSA9IHN1YnNldChXVjVfZGF0YSwgcmlza3Rha2luZyA+IDAgJiBnZW5kZXIgPiAwICYgYWdlID4wICYgZWR1Y2F0aW9uID4gMCAmIGVtcGxveWVkID4gMCAmIG1hcnJpZWQgPiAwICYgY2hpbGRyZW4gPj0gMCkKZGF0YV9XYXZlNiA9IHN1YnNldChXVjZfZGF0YSwgcmlza3Rha2luZyA+IDAgJiBnZW5kZXIgPiAwICYgYWdlID4wICYgZWR1Y2F0aW9uID4gMCAmIGVtcGxveWVkID4gMCAmIG1hcnJpZWQgPiAwICYgY2hpbGRyZW4gPj0gMCkKV1ZTX2RhdGEgPC0gbmEub21pdChXVlNfZGF0YSkKZGF0YV9XYXZlNSA8LSBuYS5vbWl0KGRhdGFfV2F2ZTUpCmRhdGFfV2F2ZTYgPC0gbmEub21pdChkYXRhX1dhdmU2KQoKCiMgVXNlIHRoZSBtdXRhdGUgZnVuY3Rpb24gdG8gY2hhbmdlIHRoZSBjb3VudHJ5IG5hbWUKV1ZTX2RhdGEgPC0gV1ZTX2RhdGEgJT4lCiAgbXV0YXRlKGNvdW50cnkgPSBpZmVsc2UoY291bnRyeSA9PSAiR3JlYXQgQnJpdGFpbiIsICJVbml0ZWQgS2luZ2RvbSIsIGNvdW50cnkpKQpgYGAKYGBge3J9CiMgVHJhbnNmcm9tIHJpc2sgaXRlbSBzdWNoIHRoYXQgaGlnaCB2YWx1ZXMgcmVwcmVzZW50IG1vcmUgcmlzayB0YWtpbmcKV1ZTX2RhdGEkcmlza3Rha2luZyA9IDYgLSBXVlNfZGF0YSRyaXNrdGFraW5nICsgMQoKICAKIyBUcmFuc2Zvcm0gcmlzayB2YXJpYWJsZSBpbnRvIFQtc2NvcmUgKG1lYW4gPSA1MCwgc2QgPSAxMCkKV1ZTX2RhdGEkVF9zY29yZV9yaXNrdGFraW5nID0gMTAqc2NhbGUoV1ZTX2RhdGEkcmlza3Rha2luZywgY2VudGVyPVRSVUUsc2NhbGU9VFJVRSkrNTAKCldWU19kYXRhCgojVHJhbnNmb3JtIHJpc2sgdmFyaWFibGUgaW50byBaIHNjb3JlIAoKIyBBc3N1bWluZyBULXNjb3JlcyBoYXZlIGEgbWVhbiBvZiA1MCBhbmQgYSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgMTAKV1ZTX2RhdGEkWl9zY29yZV9yaXNrdGFraW5nID0gKFdWU19kYXRhJFRfc2NvcmVfcmlza3Rha2luZyAtIDUwKSAvIDEwCgojIFByaW50IHRoZSByZXN1bHRpbmcgZGF0YSBmcmFtZQpwcmludChXVlNfZGF0YSkKCldWU19kYXRhIDwtIFdWU19kYXRhICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIG11dGF0ZSh6X3Njb3JlX2FnZSA9IHNjYWxlKGFnZSkpCldWU19kYXRhCmBgYAoKYGBge3J9CgpXVlNfZGF0YSRnZW5kZXIgPSBpZmVsc2UoV1ZTX2RhdGEkZ2VuZGVyID09IDEsIDAsIDEpICMgc2V4OiBtYWxlIHZzLiBmZW1hbGUKV1ZTX2RhdGEkY2hpbGRyZW4gPSBpZmVsc2UoV1ZTX2RhdGEkY2hpbGRyZW4gPT0gMCwgMCwgMSkgIyBjaGlsZHJlbjogbm8gdnMuIHllcwpXVlNfZGF0YSRtYXJyaWVkID0gaWZlbHNlKFdWU19kYXRhJG1hcnJpZWQgPT0gMSwgMSwgMCkgIyBtYXJyaWVkOiB5ZXMgdnMuIG5vCldWU19kYXRhJGVtcGxveWVkID0gaWZlbHNlKFdWU19kYXRhJGVtcGxveWVkIDwgNCwgMSwgMCkgIyBlbXBsb3llZDogeWVzIHZzLiBubwpXVlNfZGF0YSRlZHVjYXRpb24gPSBpZmVsc2UoV1ZTX2RhdGEkZWR1Y2F0aW9uIDwgNCwgMCwgMSkgIyBlZHVjYXRpb246IG5vIHByaW1hcnkgdnMuIHByaW1hcnkrIAoKCmhhcmRzaGlwIDwtIGhhcmRzaGlwX2NvbXBsZXRlICU+JQogIGRwbHlyOjpzZWxlY3QoY291bnRyeSwgaXNvY29kZSwgaGFyZHNoaXBfaW5kZXgpCmhhcmRzaGlwCmBgYApgYGB7cn0KV1ZTX21peGVkX21vZGVsIDwtIGxlZnRfam9pbihXVlNfZGF0YSwgaGFyZHNoaXAsIGJ5ID0gImNvdW50cnkiKQpXVlNfbWl4ZWRfbW9kZWwKaGVhZChXVlNfbWl4ZWRfbW9kZWwpCmBgYApgYGB7cn0KbGlicmFyeShsbWVyVGVzdCkKCiMgaW50ZXJjZXB0IG9ubHkgbW9kZWwKbW9kZWwwID0gbG1lcihaX3Njb3JlX3Jpc2t0YWtpbmcgfiAxICsgKDF8Y291bnRyeSksZGF0YSA9IFdWU19taXhlZF9tb2RlbCkKc3VtbWFyeV9tb2RlbDA9c3VtbWFyeShtb2RlbDApCnN1bW1hcnlfbW9kZWwwCmBgYApgYGB7cn0KIyBhZ2UsIHNleCAKbW9kZWwxID0gbG1lcihUX3Njb3JlX3Jpc2t0YWtpbmcgfiAxICtzY2FsZSh6X3Njb3JlX2FnZSkrZmFjdG9yKGdlbmRlcikgKyAoMStzY2FsZSh6X3Njb3JlX2FnZSkrZmFjdG9yKGdlbmRlcil8Y291bnRyeSksZGF0YSA9IFdWU19taXhlZF9tb2RlbCkKc3VtbWFyeV9tb2RlbDE9c3VtbWFyeShtb2RlbDEpCnN1bW1hcnlfbW9kZWwxCmBgYAoKYGBge3J9CiNtb2RlbCAyCmxpYnJhcnkobG1lNCkKCmxpYnJhcnkobG1lNCkKCiMgRGVmaW5lIHRoZSBsbWVyIG1vZGVsIGFuZCBhc3NpZ24gaXQgdG8gJ21vZGVsXzInCm1vZGVsXzIgPC0gbG1lcihUX3Njb3JlX3Jpc2t0YWtpbmcgfiAxICsgc2NhbGUoel9zY29yZV9hZ2UpICsgZmFjdG9yKGdlbmRlcikgKyBmYWN0b3IoY2hpbGRyZW4pICsgCiAgICAgICAgICAgICAgICAgZmFjdG9yKG1hcnJpZWQpICsgZmFjdG9yKGVtcGxveWVkKSArIGZhY3RvcihlZHVjYXRpb24pICsgCiAgICAgICAgICAgICAgICAgKDEgKyBzY2FsZSh6X3Njb3JlX2FnZSkgKyBmYWN0b3IoZ2VuZGVyKSArIGZhY3RvcihjaGlsZHJlbikgKyAKICAgICAgICAgICAgICAgICAgZmFjdG9yKG1hcnJpZWQpICsgZmFjdG9yKGVtcGxveWVkKSArIGZhY3RvcihlZHVjYXRpb24pIHwgY291bnRyeSksCiAgICAgICAgICAgICAgICBkYXRhID0gV1ZTX2RhdGEpCgojIERpc3BsYXkgdGhlIHN1bW1hcnkgb2YgdGhlIG1vZGVsCnN1bW1hcnkobW9kZWxfMikKYGBgCgoKYGBge3J9Cm1vZGVsXzMgPC0gbG1lcihUX3Njb3JlX3Jpc2t0YWtpbmcgfiAxICsgc2NhbGUoel9zY29yZV9hZ2UpICogaGFyZHNoaXBfaW5kZXggKyAKICAgICAgICAgICAgICAgICAgICBmYWN0b3IoZ2VuZGVyKSAqIGhhcmRzaGlwX2luZGV4ICsgZmFjdG9yKG1hcnJpZWQpICsgZmFjdG9yKGNoaWxkcmVuKSArIAogICAgICAgICAgICAgICAgICAgIGZhY3RvcihlZHVjYXRpb24pICsgZmFjdG9yKGVtcGxveWVkKSArIAogICAgICAgICAgICAgICAgICAgICgxICsgc2NhbGUoel9zY29yZV9hZ2UpICsgZmFjdG9yKG1hcnJpZWQpICsgZmFjdG9yKGNoaWxkcmVuKSArIAogICAgICAgICAgICAgICAgICAgICBmYWN0b3IoZWR1Y2F0aW9uKSArIGZhY3RvcihlbXBsb3llZCkgfCBjb3VudHJ5KSwKICAgICAgICAgICAgICAgIGRhdGEgPSBXVlNfbWl4ZWRfbW9kZWwpCgpzdW1tYXJ5KG1vZGVsXzMpCgoKCgpgYGAKCmBgYHtyfQphbm92YShtb2RlbDAsbW9kZWwxKQphbm92YShtb2RlbDEsbW9kZWxfMikKYW5vdmEobW9kZWxfMixtb2RlbF8zKSAKYGBgCgpgYGB7cn0KY29lZnNhbGxtb2RlbHM9cmJpbmQoc3VtbWFyeV9tb2RlbDEkY29lZmZpY2llbnRzLApzdW1tYXJ5X21vZGVsXzIkY29lZmZpY2llbnRzLApzdW1tYXJ5X21vZGVsXzMkY29lZmZpY2llbnRzW2MoMToyLDQ6OCwzLDk6MTApLF0pCgp3cml0ZS5jc3YoY29lZnNhbGxtb2RlbHMsImNvZWZzYWxsbW9kZWxzLmNzdiIpCmBgYAoKCmBgYHtyfQojIFJlYWQgdGhlIENTViBmaWxlIGludG8gYSBkYXRhIGZyYW1lCmdiZF9tZW50YWxoZWFsdGggPC0gcmVhZF9leGNlbCgiL1VzZXJzL2NyaXN0aW5hY2FuZGlkby9Eb2N1bWVudHMvR2l0aHViL3Jpc2tfd3ZzL0dCRF9tZW50YWxoZWFsdGgueGxzeCIpCgpnYmRfbWVudGFsaGVhbHRoCgojc2VsZWN0IG9ubHkgdGhlIHZhcmlhYmxlcyBvZiBpbnRlcmVzdApnYmRfbWVudGFsaGVhbHRoIDwtIGdiZF9tZW50YWxoZWFsdGggJT4lCiAgZHBseXI6OnNlbGVjdChjb3VudHJ5LCBnZW5kZXIsIGFnZSwgY2F1c2UsIHZhbCwgTWVhc3VyZSkKZ2JkX21lbnRhbGhlYWx0aAoKCmxpYnJhcnkoZHBseXIpCgojIEdyb3VwIGRhdGEgYnkgY291bnRyeSBhbmQgYWdlIGdyb3VwLCBhbmQgY2FsY3VsYXRlIHN1bW1hcnkgc3RhdGlzdGljcwpzdW1tYXJ5X2J5X2NvdW50cnlfYWdlIDwtIGdiZF9tZW50YWxoZWFsdGggJT4lCiAgZ3JvdXBfYnkoY291bnRyeSwgYWdlKSAlPiUKICBzdW1tYXJpc2UoCiAgICBtZWFuX0RBTFlzID0gbWVhbih2YWwpKSAgIyBDYWxjdWxhdGUgbWVhbiBvZiBEQUxZcwoKbGlicmFyeShkcGx5cikKCiMgQXNzdW1pbmcgJ3N1bW1hcnlfYnlfY291bnRyeV9hZ2UnIGNvbnRhaW5zIHlvdXIgc3VtbWFyaXplZCBkYXRhc2V0Cm1lYW5fYnlfY291bnRyeSA8LSBzdW1tYXJ5X2J5X2NvdW50cnlfYWdlICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIHN1bW1hcmlzZShtZWFuX0RBTFlzID0gbWVhbihtZWFuX0RBTFlzKSkKCiMgVmlldyB0aGUgcmVzdWx0aW5nIG1lYW4gYnkgY291bnRyeQpwcmludChtZWFuX2J5X2NvdW50cnkpCgojbG9nIHRyYW5zZm9ybQptZWFuX2J5X2NvdW50cnkkbWVhbl9EQUxZcz1sb2cobWVhbl9ieV9jb3VudHJ5JG1lYW5fREFMWXMpCiAKbWVhbl9ieV9jb3VudHJ5IAoKI1JldmVyc2UgY29kaWVydW5nIAptZWFuX2J5X2NvdW50cnkkbWVhbl9EQUxZcz1zY2FsZShtZWFuX2J5X2NvdW50cnkkbWVhbl9EQUxZcykKCm1lYW5fYnlfY291bnRyeQoKI3JlbmFtZSBtZWFuX0RBTFlTCm1lbnRhbF9oZWFsdGhfaW5kZXggPC0gbWVhbl9ieV9jb3VudHJ5ICU+JQogIHJlbmFtZSgnbWVudGFsX2hlYWx0aCcgPSBtZWFuX0RBTFlzKQptZW50YWxfaGVhbHRoX2luZGV4CgpgYGAKYGBge3J9CmxpYnJhcnkoZHBseXIpCgojIyMjIyMjQW54aWV0eSBkaXNvcmRlcnMjIyMjIyMjIyMKI0ZpbHRlciBkYXRhIGZvciBhIHNwZWNpZmljIG1lbnRhbCBkaXNvcmRlciAoZS5nLiwgQW54aWV0eSBEaXNvcmRlcnMpCmFueGlldHlfZGlzb3JkZXJzIDwtIGdiZF9tZW50YWxoZWFsdGggJT4lCiAgZmlsdGVyKGNhdXNlID09ICJBbnhpZXR5IGRpc29yZGVycyIpICAjIENoYW5nZSAiQW54aWV0eSBEaXNvcmRlcnMiIHRvIHRoZSBkZXNpcmVkIGRpc29yZGVyCgojIENhbGN1bGF0ZSB0aGUgbWVhbiBvZiAndmFsJyAoRGlzYWJpbGl0eS1BZGp1c3RlZCBMaWZlIFllYXJzKSBhY3Jvc3MgbG9jYXRpb25zIGFuZCBhZ2VzCm1lYW5fREFMWXMgPC0gbWVhbihhbnhpZXR5X2Rpc29yZGVycyR2YWwpCgojIE9wdGlvbmFsbHksIGlmIHlvdSB3YW50IHRvIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnk6CmFueGlldHlfZGlzb3JkZXJzIDwtIGFueGlldHlfZGlzb3JkZXJzICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIHN1bW1hcmlzZShtZWFuX0FueGlldHlfZGlzb3JkZXJzID0gbWVhbih2YWwpKQoKYW54aWV0eV9kaXNvcmRlcnMKCiNsb2cgdHJhbnNmb3JtCmFueGlldHlfZGlzb3JkZXJzJG1lYW5fQW54aWV0eV9kaXNvcmRlcnM9bG9nKGFueGlldHlfZGlzb3JkZXJzJG1lYW5fQW54aWV0eV9kaXNvcmRlcnMpCiAKYW54aWV0eV9kaXNvcmRlcnMKCiNSZXZlcnNlIGNvZGllcnVuZyAKYW54aWV0eV9kaXNvcmRlcnMkbWVhbl9BbnhpZXR5X2Rpc29yZGVycz1zY2FsZShhbnhpZXR5X2Rpc29yZGVycyRtZWFuX0FueGlldHlfZGlzb3JkZXJzKQphbnhpZXR5X2Rpc29yZGVycwptZW50YWxfaGVhbHRoX2luZGV4CgpgYGAKYGBge3J9CmdiZF9tZW50YWxoZWFsdGgKCiMgQXNzdW1pbmcgZ2JkX21lbnRhbGhlYWx0aCBpcyB5b3VyIGRhdGEgZnJhbWUgY29udGFpbmluZyB0aGUgJ2NhdXNlJyBjb2x1bW4KCiMgR2V0IHVuaXF1ZSB2YWx1ZXMgb2YgJ2NhdXNlJyBjb2x1bW4KdW5pcXVlX2NhdXNlcyA8LSB1bmlxdWUoZ2JkX21lbnRhbGhlYWx0aCRjYXVzZSkKCiMgQ3JlYXRlIGEgZGF0YSBmcmFtZSB3aXRoIHVuaXF1ZSBjYXVzZXMKY2F1c2VfdGFibGUgPC0gZGF0YS5mcmFtZShDYXVzZSA9IHVuaXF1ZV9jYXVzZXMpCgojIFByaW50IHRoZSBjYXVzZSB0YWJsZQpwcmludChjYXVzZV90YWJsZSkKCgpgYGAKYGBge3J9CiMjIyMjIyNCdWxpbWlhIG5lcnZvc2EjIyMjIyMjIwpsaWJyYXJ5KGRwbHlyKQoKIyBGaWx0ZXIgdGhlIGRhdGEgZm9yICdCdWxpbWlhIE5lcnZvc2EnCmJ1bGltaWFfbmVydm9zYSA8LSBnYmRfbWVudGFsaGVhbHRoICU+JQogIGZpbHRlcihjYXVzZSA9PSAiQnVsaW1pYSBuZXJ2b3NhIikKCiMgQ2FsY3VsYXRlIHRoZSBtZWFuIG9mICd2YWwnIChEQUxZcykgYWNyb3NzIGFsbCBsb2NhdGlvbnMKbWVhbl9EQUxZcyA8LSBtZWFuKGJ1bGltaWFfbmVydm9zYSR2YWwpCgojIE9wdGlvbmFsbHksIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnkKYnVsaW1pYV9uZXJ2b3NhIDwtIGJ1bGltaWFfbmVydm9zYSAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBzdW1tYXJpc2UobWVhbl9idWxpbWlhX25lcnZvc2EgPSBtZWFuKHZhbCkpCgojIExvZyB0cmFuc2Zvcm0gdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbgpidWxpbWlhX25lcnZvc2EkbWVhbl9idWxpbWlhX25lcnZvc2EgPC0gbG9nKGJ1bGltaWFfbmVydm9zYSRtZWFuX2J1bGltaWFfbmVydm9zYSkKCiMgU2NhbGUgdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbiAoaWYgbmVlZGVkKQpidWxpbWlhX25lcnZvc2EkbWVhbl9idWxpbWlhX25lcnZvc2EgPC0gc2NhbGUoYnVsaW1pYV9uZXJ2b3NhJG1lYW5fYnVsaW1pYV9uZXJ2b3NhKQoKIyBQcmludCB0aGUgcmVzdWx0aW5nIGRhdGEgZnJhbWUKcHJpbnQoYnVsaW1pYV9uZXJ2b3NhKQpwcmludChhbnhpZXR5X2Rpc29yZGVycykKCmdiZF9tZW50YWxoZWFsdGgKCmBgYApgYGB7cn0KIyMjIyNBdHRlbnRpb24tZGVmaWNpdC9oeXBlcmFjdGl2aXR5IGRpc29yZGVyCmxpYnJhcnkoZHBseXIpCgoKQURIRCA8LSBnYmRfbWVudGFsaGVhbHRoICU+JQogIGZpbHRlcihjYXVzZSA9PSAiQXR0ZW50aW9uLWRlZmljaXQvaHlwZXJhY3Rpdml0eSBkaXNvcmRlciIpCgojIENhbGN1bGF0ZSB0aGUgbWVhbiBvZiAndmFsJyAoREFMWXMpIGFjcm9zcyBhbGwgbG9jYXRpb25zCm1lYW5fREFMWXMgPC0gbWVhbihBREhEJHZhbCkKCiMgT3B0aW9uYWxseSwgY2FsY3VsYXRlIG1lYW4gYnkgY291bnRyeQpBREhEIDwtIEFESEQgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgc3VtbWFyaXNlKG1lYW5fQURIRCA9IG1lYW4odmFsKSkKCiMgTG9nIHRyYW5zZm9ybSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uCkFESEQkbWVhbl9BREhEIDwtIGxvZyhBREhEJG1lYW5fQURIRCkKCiMgU2NhbGUgdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbiAoaWYgbmVlZGVkKQpBREhEJG1lYW5fQURIRCA8LSBzY2FsZShBREhEJG1lYW5fQURIRCkKCiMgUHJpbnQgdGhlIHJlc3VsdGluZyBkYXRhIGZyYW1lCnByaW50KEFESEQpCgpgYGAKYGBge3J9CiMjIyMjIyMjI0lkaW9wYXRoaWMgZGV2ZWxvcG1lbnQgaW50ZWxsZWN0dWFsIGFiaWxpdHkgCmxpYnJhcnkoZHBseXIpCgoKSWRpb3BhdGhpY19kZXZlbG9wbWVudGFsX2ludGVsbGVjdHVhbF9kaXNhYmlsaXR5IDwtIGdiZF9tZW50YWxoZWFsdGggJT4lCiAgZmlsdGVyKGNhdXNlID09ICJJZGlvcGF0aGljIGRldmVsb3BtZW50YWwgaW50ZWxsZWN0dWFsIGRpc2FiaWxpdHkiKQoKIyBDYWxjdWxhdGUgdGhlIG1lYW4gb2YgJ3ZhbCcgKERBTFlzKSBhY3Jvc3MgYWxsIGxvY2F0aW9ucwptZWFuX0RBTFlzIDwtIG1lYW4oSWRpb3BhdGhpY19kZXZlbG9wbWVudGFsX2ludGVsbGVjdHVhbF9kaXNhYmlsaXR5JHZhbCkKCiMgT3B0aW9uYWxseSwgY2FsY3VsYXRlIG1lYW4gYnkgY291bnRyeQpJZGlvcGF0aGljX2RldmVsb3BtZW50YWxfaW50ZWxsZWN0dWFsX2Rpc2FiaWxpdHkgPC0gSWRpb3BhdGhpY19kZXZlbG9wbWVudGFsX2ludGVsbGVjdHVhbF9kaXNhYmlsaXR5ICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIHN1bW1hcmlzZShtZWFuX0lkaW9wYXRoaWNfZGV2ZWxvcG1lbnRhbF9pbnRlbGxlY3R1YWxfZGlzYWJpbGl0eSA9IG1lYW4odmFsKSkKCiMgTG9nIHRyYW5zZm9ybSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uCklkaW9wYXRoaWNfZGV2ZWxvcG1lbnRhbF9pbnRlbGxlY3R1YWxfZGlzYWJpbGl0eSRtZWFuX0lkaW9wYXRoaWNfZGV2ZWxvcG1lbnRhbF9pbnRlbGxlY3R1YWxfZGlzYWJpbGl0eSA8LSBsb2coSWRpb3BhdGhpY19kZXZlbG9wbWVudGFsX2ludGVsbGVjdHVhbF9kaXNhYmlsaXR5JG1lYW5fSWRpb3BhdGhpY19kZXZlbG9wbWVudGFsX2ludGVsbGVjdHVhbF9kaXNhYmlsaXR5KQoKIyBTY2FsZSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uIChpZiBuZWVkZWQpCklkaW9wYXRoaWNfZGV2ZWxvcG1lbnRhbF9pbnRlbGxlY3R1YWxfZGlzYWJpbGl0eSRtZWFuX0lkaW9wYXRoaWNfZGV2ZWxvcG1lbnRhbF9pbnRlbGxlY3R1YWxfZGlzYWJpbGl0eSA8LSBzY2FsZShJZGlvcGF0aGljX2RldmVsb3BtZW50YWxfaW50ZWxsZWN0dWFsX2Rpc2FiaWxpdHkkbWVhbl9JZGlvcGF0aGljX2RldmVsb3BtZW50YWxfaW50ZWxsZWN0dWFsX2Rpc2FiaWxpdHkpCgojIFByaW50IHRoZSByZXN1bHRpbmcgZGF0YSBmcmFtZQpwcmludChJZGlvcGF0aGljX2RldmVsb3BtZW50YWxfaW50ZWxsZWN0dWFsX2Rpc2FiaWxpdHkpCmBgYApgYGB7cn0KIyMjIyMjQW5vcmV4aWEgTmVydm9zYQoKYW5vcmV4aWFfbmVydm9zYSA8LSBnYmRfbWVudGFsaGVhbHRoICU+JQogIGZpbHRlcihjYXVzZSA9PSAiQW5vcmV4aWEgbmVydm9zYSIpCgojIENhbGN1bGF0ZSB0aGUgbWVhbiBvZiAndmFsJyAoREFMWXMpIGFjcm9zcyBhbGwgbG9jYXRpb25zCm1lYW5fREFMWXMgPC0gbWVhbihhbm9yZXhpYV9uZXJ2b3NhJHZhbCkKCiMgT3B0aW9uYWxseSwgY2FsY3VsYXRlIG1lYW4gYnkgY291bnRyeQphbm9yZXhpYV9uZXJ2b3NhIDwtIGFub3JleGlhX25lcnZvc2EgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgc3VtbWFyaXNlKG1lYW5fYW5vcmV4aWFfbmVydm9zYSA9IG1lYW4odmFsKSkKCiMgTG9nIHRyYW5zZm9ybSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uCmFub3JleGlhX25lcnZvc2EkbWVhbl9hbm9yZXhpYV9uZXJ2b3NhIDwtIGxvZyhhbm9yZXhpYV9uZXJ2b3NhJG1lYW5fYW5vcmV4aWFfbmVydm9zYSkKCiMgU2NhbGUgdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbiAoaWYgbmVlZGVkKQphbm9yZXhpYV9uZXJ2b3NhJG1lYW5fYW5vcmV4aWFfbmVydm9zYSA8LSBzY2FsZShhbm9yZXhpYV9uZXJ2b3NhJG1lYW5fYW5vcmV4aWFfbmVydm9zYSkKCiMgUHJpbnQgdGhlIHJlc3VsdGluZyBkYXRhIGZyYW1lCnByaW50KGFub3JleGlhX25lcnZvc2EpCmBgYApgYGB7cn0KIyMjIyNEZXByZXNzaXZlIGRpc29yZGVycyMjIyMjIyMKCmRlcHJlc3NpdmVfZGlzb3JkZXJzIDwtIGdiZF9tZW50YWxoZWFsdGggJT4lCiAgZmlsdGVyKGNhdXNlID09ICJEZXByZXNzaXZlIGRpc29yZGVycyIpCgojIENhbGN1bGF0ZSB0aGUgbWVhbiBvZiAndmFsJyAoREFMWXMpIGFjcm9zcyBhbGwgbG9jYXRpb25zCm1lYW5fREFMWXMgPC0gbWVhbihkZXByZXNzaXZlX2Rpc29yZGVycyR2YWwpCgojIE9wdGlvbmFsbHksIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnkKZGVwcmVzc2l2ZV9kaXNvcmRlcnMgPC0gZGVwcmVzc2l2ZV9kaXNvcmRlcnMgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgc3VtbWFyaXNlKG1lYW5fZGVwcmVzc2l2ZV9kaXNvcmRlcnMgPSBtZWFuKHZhbCkpCgojIExvZyB0cmFuc2Zvcm0gdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbgpkZXByZXNzaXZlX2Rpc29yZGVycyRtZWFuX2RlcHJlc3NpdmVfZGlzb3JkZXJzIDwtIGxvZyhkZXByZXNzaXZlX2Rpc29yZGVycyRtZWFuX2RlcHJlc3NpdmVfZGlzb3JkZXJzKQoKIyBTY2FsZSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uIChpZiBuZWVkZWQpCmRlcHJlc3NpdmVfZGlzb3JkZXJzJG1lYW5fZGVwcmVzc2l2ZV9kaXNvcmRlcnMgPC0gc2NhbGUoZGVwcmVzc2l2ZV9kaXNvcmRlcnMkbWVhbl9kZXByZXNzaXZlX2Rpc29yZGVycykKCiMgUHJpbnQgdGhlIHJlc3VsdGluZyBkYXRhIGZyYW1lCnByaW50KGRlcHJlc3NpdmVfZGlzb3JkZXJzKQpgYGAKCmBgYHtyfQojIyMjIyMjQXV0aXNtdXMgc3BlY3RydW0gZGlzb3JkZXJzIyMjIyMjCgphdXRpc211c19zcGVjdHJ1bV9kaXNvcmRlcnMgPC0gZ2JkX21lbnRhbGhlYWx0aCAlPiUKICBmaWx0ZXIoY2F1c2UgPT0gIkF1dGlzbSBzcGVjdHJ1bSBkaXNvcmRlcnMiKQoKIyBDYWxjdWxhdGUgdGhlIG1lYW4gb2YgJ3ZhbCcgKERBTFlzKSBhY3Jvc3MgYWxsIGxvY2F0aW9ucwptZWFuX0RBTFlzIDwtIG1lYW4oYXV0aXNtdXNfc3BlY3RydW1fZGlzb3JkZXJzJHZhbCkKCiMgT3B0aW9uYWxseSwgY2FsY3VsYXRlIG1lYW4gYnkgY291bnRyeQphdXRpc211c19zcGVjdHJ1bV9kaXNvcmRlcnMgPC0gYXV0aXNtdXNfc3BlY3RydW1fZGlzb3JkZXJzICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIHN1bW1hcmlzZShtZWFuX2F1dGlzbXVzX3NwZWN0cnVtX2Rpc29yZGVycyA9IG1lYW4odmFsKSkKCiMgTG9nIHRyYW5zZm9ybSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uCmF1dGlzbXVzX3NwZWN0cnVtX2Rpc29yZGVycyRtZWFuX2F1dGlzbXVzX3NwZWN0cnVtX2Rpc29yZGVycyA8LSBsb2coYXV0aXNtdXNfc3BlY3RydW1fZGlzb3JkZXJzJG1lYW5fYXV0aXNtdXNfc3BlY3RydW1fZGlzb3JkZXJzKQoKIyBTY2FsZSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uIChpZiBuZWVkZWQpCmF1dGlzbXVzX3NwZWN0cnVtX2Rpc29yZGVycyRtZWFuX2F1dGlzbXVzX3NwZWN0cnVtX2Rpc29yZGVycyA8LSBzY2FsZShhdXRpc211c19zcGVjdHJ1bV9kaXNvcmRlcnMkbWVhbl9hdXRpc211c19zcGVjdHJ1bV9kaXNvcmRlcnMpCgojIFByaW50IHRoZSByZXN1bHRpbmcgZGF0YSBmcmFtZQpwcmludChhdXRpc211c19zcGVjdHJ1bV9kaXNvcmRlcnMpCmBgYAoKYGBge3J9CiMjIyMjI1NjaGl6b3BocmVuaWEjIyMjIyMjCnNjaGl6b3BocmVuaWEgPC0gZ2JkX21lbnRhbGhlYWx0aCAlPiUKICBmaWx0ZXIoY2F1c2UgPT0gIlNjaGl6b3BocmVuaWEiKQoKIyBDYWxjdWxhdGUgdGhlIG1lYW4gb2YgJ3ZhbCcgKERBTFlzKSBhY3Jvc3MgYWxsIGxvY2F0aW9ucwptZWFuX0RBTFlzIDwtIG1lYW4oc2NoaXpvcGhyZW5pYSR2YWwpCgojIE9wdGlvbmFsbHksIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnkKc2NoaXpvcGhyZW5pYSA8LSBzY2hpem9waHJlbmlhICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIHN1bW1hcmlzZShtZWFuX3NjaGl6b3BocmVuaWEgPSBtZWFuKHZhbCkpCgojIExvZyB0cmFuc2Zvcm0gdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbgpzY2hpem9waHJlbmlhJG1lYW5fc2NoaXpvcGhyZW5pYSA8LSBsb2coc2NoaXpvcGhyZW5pYSRtZWFuX3NjaGl6b3BocmVuaWEpCgojIFNjYWxlIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4gKGlmIG5lZWRlZCkKc2NoaXpvcGhyZW5pYSRtZWFuX3NjaGl6b3BocmVuaWEgPC0gc2NhbGUoc2NoaXpvcGhyZW5pYSRtZWFuX3NjaGl6b3BocmVuaWEpCgojIFByaW50IHRoZSByZXN1bHRpbmcgZGF0YSBmcmFtZQpwcmludChzY2hpem9waHJlbmlhKQoKYGBgCgpgYGB7cn0KIyMjIyMjI0NvbmR1Y3QgZGlzb3JkZXJzIyMjIyMjIyMjCmNvbmR1Y3RfZGlzb3JkZXJzIDwtIGdiZF9tZW50YWxoZWFsdGggJT4lCiAgZmlsdGVyKGNhdXNlID09ICJDb25kdWN0IGRpc29yZGVyIikKCiMgQ2FsY3VsYXRlIHRoZSBtZWFuIG9mICd2YWwnIChEQUxZcykgYWNyb3NzIGFsbCBsb2NhdGlvbnMKbWVhbl9EQUxZcyA8LSBtZWFuKGNvbmR1Y3RfZGlzb3JkZXJzJHZhbCkKCiMgT3B0aW9uYWxseSwgY2FsY3VsYXRlIG1lYW4gYnkgY291bnRyeQpjb25kdWN0X2Rpc29yZGVycyA8LSBjb25kdWN0X2Rpc29yZGVycyAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBzdW1tYXJpc2UobWVhbl9jb25kdWN0X2Rpc29yZGVycyA9IG1lYW4odmFsKSkKCiMgTG9nIHRyYW5zZm9ybSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uCmNvbmR1Y3RfZGlzb3JkZXJzJG1lYW5fY29uZHVjdF9kaXNvcmRlcnMgPC0gbG9nKGNvbmR1Y3RfZGlzb3JkZXJzJG1lYW5fY29uZHVjdF9kaXNvcmRlcnMpCgojIFNjYWxlIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4gKGlmIG5lZWRlZCkKY29uZHVjdF9kaXNvcmRlcnMkbWVhbl9jb25kdWN0X2Rpc29yZGVycyA8LSBzY2FsZShjb25kdWN0X2Rpc29yZGVycyRtZWFuX2NvbmR1Y3RfZGlzb3JkZXJzKQoKIyBQcmludCB0aGUgcmVzdWx0aW5nIGRhdGEgZnJhbWUKcHJpbnQoY29uZHVjdF9kaXNvcmRlcnMpCgoKYGBgCgpgYGB7cn0KIyMjIyMjIyNFYXRpbmcgZGlzb3JkZXJzIyMjIyMjIyMjCmVhdGluZ19kaXNvcmRlcnMgPC0gZ2JkX21lbnRhbGhlYWx0aCAlPiUKICBmaWx0ZXIoY2F1c2UgPT0gIkVhdGluZyBkaXNvcmRlcnMiKQoKIyBDYWxjdWxhdGUgdGhlIG1lYW4gb2YgJ3ZhbCcgKERBTFlzKSBhY3Jvc3MgYWxsIGxvY2F0aW9ucwptZWFuX0RBTFlzIDwtIG1lYW4oZWF0aW5nX2Rpc29yZGVycyR2YWwpCgojIE9wdGlvbmFsbHksIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnkKZWF0aW5nX2Rpc29yZGVycyA8LSBlYXRpbmdfZGlzb3JkZXJzICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIHN1bW1hcmlzZShtZWFuX2VhdGluZ19kaXNvcmRlcnMgPSBtZWFuKHZhbCkpCgojIExvZyB0cmFuc2Zvcm0gdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbgplYXRpbmdfZGlzb3JkZXJzJG1lYW5fZWF0aW5nX2Rpc29yZGVycyA8LSBsb2coZWF0aW5nX2Rpc29yZGVycyRtZWFuX2VhdGluZ19kaXNvcmRlcnMpCgojIFNjYWxlIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4gKGlmIG5lZWRlZCkKZWF0aW5nX2Rpc29yZGVycyRtZWFuX2VhdGluZ19kaXNvcmRlcnMgPC0gc2NhbGUoZWF0aW5nX2Rpc29yZGVycyRtZWFuX2VhdGluZ19kaXNvcmRlcnMpCgojIFByaW50IHRoZSByZXN1bHRpbmcgZGF0YSBmcmFtZQpwcmludChlYXRpbmdfZGlzb3JkZXJzKQoKYGBgCmBgYHtyfQojIyMjIyMjI0JpcG9sYXIgZGlzb3JkZXIjIyMjIyMjIyMKYmlwb2xhcl9kaXNvcmRlciA8LSBnYmRfbWVudGFsaGVhbHRoICU+JQogIGZpbHRlcihjYXVzZSA9PSAiQmlwb2xhciBkaXNvcmRlciIpCgojIENhbGN1bGF0ZSB0aGUgbWVhbiBvZiAndmFsJyAoREFMWXMpIGFjcm9zcyBhbGwgbG9jYXRpb25zCm1lYW5fREFMWXMgPC0gbWVhbihiaXBvbGFyX2Rpc29yZGVyJHZhbCkKCiMgT3B0aW9uYWxseSwgY2FsY3VsYXRlIG1lYW4gYnkgY291bnRyeQpiaXBvbGFyX2Rpc29yZGVyIDwtIGJpcG9sYXJfZGlzb3JkZXIgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgc3VtbWFyaXNlKG1lYW5fYmlwb2xhcl9kaXNvcmRlciA9IG1lYW4odmFsKSkKCiMgTG9nIHRyYW5zZm9ybSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uCmJpcG9sYXJfZGlzb3JkZXIkbWVhbl9iaXBvbGFyX2Rpc29yZGVyIDwtIGxvZyhiaXBvbGFyX2Rpc29yZGVyJG1lYW5fYmlwb2xhcl9kaXNvcmRlcikKCiMgU2NhbGUgdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbiAoaWYgbmVlZGVkKQpiaXBvbGFyX2Rpc29yZGVyJG1lYW5fYmlwb2xhcl9kaXNvcmRlciA8LSBzY2FsZShiaXBvbGFyX2Rpc29yZGVyJG1lYW5fYmlwb2xhcl9kaXNvcmRlcikKCiMgUHJpbnQgdGhlIHJlc3VsdGluZyBkYXRhIGZyYW1lCnByaW50KGJpcG9sYXJfZGlzb3JkZXIpCgpgYGAKYGBge3J9CnByaW50KGNhdXNlX3RhYmxlKQpgYGAKYGBge3J9CiMjIyMjIyMjU3Vic3RhbmNlIHVzZSBkaXNvcmRlcnMjIyMjIyMjIwoKc3Vic3RhbmNlX3VzZV9kaXNvcmRlcnMgPC0gZ2JkX21lbnRhbGhlYWx0aCAlPiUKICBmaWx0ZXIoY2F1c2UgPT0gIlN1YnN0YW5jZSB1c2UgZGlzb3JkZXJzIikKCiMgQ2FsY3VsYXRlIHRoZSBtZWFuIG9mICd2YWwnIChEQUxZcykgYWNyb3NzIGFsbCBsb2NhdGlvbnMKbWVhbl9EQUxZcyA8LSBtZWFuKHN1YnN0YW5jZV91c2VfZGlzb3JkZXJzJHZhbCkKCiMgT3B0aW9uYWxseSwgY2FsY3VsYXRlIG1lYW4gYnkgY291bnRyeQpzdWJzdGFuY2VfdXNlX2Rpc29yZGVycyA8LSBzdWJzdGFuY2VfdXNlX2Rpc29yZGVycyAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBzdW1tYXJpc2UobWVhbl9zdWJzdGFuY2VfdXNlX2Rpc29yZGVycyA9IG1lYW4odmFsKSkKCiMgTG9nIHRyYW5zZm9ybSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uCnN1YnN0YW5jZV91c2VfZGlzb3JkZXJzJG1lYW5fc3Vic3RhbmNlX3VzZV9kaXNvcmRlcnMgPC0gbG9nKHN1YnN0YW5jZV91c2VfZGlzb3JkZXJzJG1lYW5fc3Vic3RhbmNlX3VzZV9kaXNvcmRlcnMpCgojIFNjYWxlIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4gKGlmIG5lZWRlZCkKc3Vic3RhbmNlX3VzZV9kaXNvcmRlcnMkbWVhbl9zdWJzdGFuY2VfdXNlX2Rpc29yZGVycyA8LSBzY2FsZShzdWJzdGFuY2VfdXNlX2Rpc29yZGVycyRtZWFuX3N1YnN0YW5jZV91c2VfZGlzb3JkZXJzKQoKIyBQcmludCB0aGUgcmVzdWx0aW5nIGRhdGEgZnJhbWUKcHJpbnQoc3Vic3RhbmNlX3VzZV9kaXNvcmRlcnMpCgpgYGAKYGBge3J9CiMjIyNEcnVnIHVzZSBkaXNvcmRlcnMKCmRydWdfdXNlX2Rpc29yZGVycyA8LSBnYmRfbWVudGFsaGVhbHRoICU+JQogIGZpbHRlcihjYXVzZSA9PSAiRHJ1ZyB1c2UgZGlzb3JkZXJzIikKCiMgQ2FsY3VsYXRlIHRoZSBtZWFuIG9mICd2YWwnIChEQUxZcykgYWNyb3NzIGFsbCBsb2NhdGlvbnMKbWVhbl9EQUxZcyA8LSBtZWFuKGRydWdfdXNlX2Rpc29yZGVycyR2YWwpCgojIE9wdGlvbmFsbHksIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnkKZHJ1Z191c2VfZGlzb3JkZXJzIDwtIGRydWdfdXNlX2Rpc29yZGVycyAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBzdW1tYXJpc2UobWVhbl9kcnVnX3VzZV9kaXNvcmRlcnMgPSBtZWFuKHZhbCkpCgojIExvZyB0cmFuc2Zvcm0gdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbgpkcnVnX3VzZV9kaXNvcmRlcnMkbWVhbl9kcnVnX3VzZV9kaXNvcmRlcnMgPC0gbG9nKGRydWdfdXNlX2Rpc29yZGVycyRtZWFuX2RydWdfdXNlX2Rpc29yZGVycykKCiMgU2NhbGUgdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbiAoaWYgbmVlZGVkKQpkcnVnX3VzZV9kaXNvcmRlcnMkbWVhbl9kcnVnX3VzZV9kaXNvcmRlcnMgPC0gc2NhbGUoZHJ1Z191c2VfZGlzb3JkZXJzJG1lYW5fZHJ1Z191c2VfZGlzb3JkZXJzKQoKIyBQcmludCB0aGUgcmVzdWx0aW5nIGRhdGEgZnJhbWUKcHJpbnQoZHJ1Z191c2VfZGlzb3JkZXJzKQoKCmBgYApgYGB7cn0KIyMjIyMjIyMjI0FsY29ob2wgdXNlIGRpc29yZGVycwphbGNvaG9sX3VzZV9kaXNvcmRlcnMgPC0gZ2JkX21lbnRhbGhlYWx0aCAlPiUKICBmaWx0ZXIoY2F1c2UgPT0gIkFsY29ob2wgdXNlIGRpc29yZGVycyIpCgojIENhbGN1bGF0ZSB0aGUgbWVhbiBvZiAndmFsJyAoREFMWXMpIGFjcm9zcyBhbGwgbG9jYXRpb25zCm1lYW5fREFMWXMgPC0gbWVhbihhbGNvaG9sX3VzZV9kaXNvcmRlcnMkdmFsKQoKIyBPcHRpb25hbGx5LCBjYWxjdWxhdGUgbWVhbiBieSBjb3VudHJ5CmFsY29ob2xfdXNlX2Rpc29yZGVycyA8LSBhbGNvaG9sX3VzZV9kaXNvcmRlcnMgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgc3VtbWFyaXNlKG1lYW5fYWxjb2hvbF91c2VfZGlzb3JkZXJzID0gbWVhbih2YWwpKQoKIyBMb2cgdHJhbnNmb3JtIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4KYWxjb2hvbF91c2VfZGlzb3JkZXJzJG1lYW5fYWxjb2hvbF91c2VfZGlzb3JkZXJzIDwtIGxvZyhhbGNvaG9sX3VzZV9kaXNvcmRlcnMkbWVhbl9hbGNvaG9sX3VzZV9kaXNvcmRlcnMpCgojIFNjYWxlIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4gKGlmIG5lZWRlZCkKYWxjb2hvbF91c2VfZGlzb3JkZXJzJG1lYW5fYWxjb2hvbF91c2VfZGlzb3JkZXJzIDwtIHNjYWxlKGFsY29ob2xfdXNlX2Rpc29yZGVycyRtZWFuX2FsY29ob2xfdXNlX2Rpc29yZGVycykKCiMgUHJpbnQgdGhlIHJlc3VsdGluZyBkYXRhIGZyYW1lCnByaW50KGFsY29ob2xfdXNlX2Rpc29yZGVycykKCmBgYApgYGB7cn0KIyMjIyMjI01ham9yIGRlcHJlc3NpdmUgZGlzb3JkZXJzCm1ham9yX2RlcHJlc3NpdmVfZGlzb3JkZXIgPC0gZ2JkX21lbnRhbGhlYWx0aCAlPiUKICBmaWx0ZXIoY2F1c2UgPT0gIk1ham9yIGRlcHJlc3NpdmUgZGlzb3JkZXIiKQoKIyBDYWxjdWxhdGUgdGhlIG1lYW4gb2YgJ3ZhbCcgKERBTFlzKSBhY3Jvc3MgYWxsIGxvY2F0aW9ucwptZWFuX0RBTFlzIDwtIG1lYW4obWFqb3JfZGVwcmVzc2l2ZV9kaXNvcmRlciR2YWwpCgojIE9wdGlvbmFsbHksIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnkKbWFqb3JfZGVwcmVzc2l2ZV9kaXNvcmRlciA8LSBtYWpvcl9kZXByZXNzaXZlX2Rpc29yZGVyICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIHN1bW1hcmlzZShtZWFuX21ham9yX2RlcHJlc3NpdmVfZGlzb3JkZXIgPSBtZWFuKHZhbCkpCgojIExvZyB0cmFuc2Zvcm0gdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbgptYWpvcl9kZXByZXNzaXZlX2Rpc29yZGVyJG1lYW5fbWFqb3JfZGVwcmVzc2l2ZV9kaXNvcmRlciA8LSBsb2cobWFqb3JfZGVwcmVzc2l2ZV9kaXNvcmRlciRtZWFuX21ham9yX2RlcHJlc3NpdmVfZGlzb3JkZXIpCgojIFNjYWxlIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4gKGlmIG5lZWRlZCkKbWFqb3JfZGVwcmVzc2l2ZV9kaXNvcmRlciRtZWFuX21ham9yX2RlcHJlc3NpdmVfZGlzb3JkZXIgPC0gc2NhbGUobWFqb3JfZGVwcmVzc2l2ZV9kaXNvcmRlciRtZWFuX21ham9yX2RlcHJlc3NpdmVfZGlzb3JkZXIpCgojIFByaW50IHRoZSByZXN1bHRpbmcgZGF0YSBmcmFtZQpwcmludChtYWpvcl9kZXByZXNzaXZlX2Rpc29yZGVyKQoKYGBgCmBgYHtyfQojIyMjIyMjRHlzdGh5bWlhIyMjIyMjIyMKCmR5c3RoeW1pYSA8LSBnYmRfbWVudGFsaGVhbHRoICU+JQogIGZpbHRlcihjYXVzZSA9PSAiRHlzdGh5bWlhIikKCiMgQ2FsY3VsYXRlIHRoZSBtZWFuIG9mICd2YWwnIChEQUxZcykgYWNyb3NzIGFsbCBsb2NhdGlvbnMKbWVhbl9EQUxZcyA8LSBtZWFuKGR5c3RoeW1pYSR2YWwpCgojIE9wdGlvbmFsbHksIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnkKZHlzdGh5bWlhIDwtIGR5c3RoeW1pYSAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBzdW1tYXJpc2UobWVhbl9keXN0aHltaWEgPSBtZWFuKHZhbCkpCgojIExvZyB0cmFuc2Zvcm0gdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbgpkeXN0aHltaWEkbWVhbl9keXN0aHltaWEgPC0gbG9nKGR5c3RoeW1pYSRtZWFuX2R5c3RoeW1pYSkKCiMgU2NhbGUgdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbiAoaWYgbmVlZGVkKQpkeXN0aHltaWEkbWVhbl9keXN0aHltaWEgPC0gc2NhbGUoZHlzdGh5bWlhJG1lYW5fZHlzdGh5bWlhKQoKIyBQcmludCB0aGUgcmVzdWx0aW5nIGRhdGEgZnJhbWUKcHJpbnQoZHlzdGh5bWlhKQoKCmBgYApgYGB7cn0KbGlicmFyeShkcGx5cikKCiMgUGVyZm9ybSBsZWZ0IGpvaW5zIGZvciBlYWNoIGRhdGEgZnJhbWUgb24gJ2NvdW50cnknCmZpbmFsX21lbnRhbF9oZWFsdGhfaW5kZXggPC0gbWVudGFsX2hlYWx0aF9pbmRleCAlPiUKICBsZWZ0X2pvaW4oYnVsaW1pYV9uZXJ2b3NhLCBieSA9ICJjb3VudHJ5IikgJT4lCiAgbGVmdF9qb2luKEFESEQsIGJ5ID0gImNvdW50cnkiKSAlPiUKICBsZWZ0X2pvaW4oSWRpb3BhdGhpY19kZXZlbG9wbWVudGFsX2ludGVsbGVjdHVhbF9kaXNhYmlsaXR5LCBieSA9ICJjb3VudHJ5IikgJT4lCiAgbGVmdF9qb2luKGFub3JleGlhX25lcnZvc2EsIGJ5ID0gImNvdW50cnkiKSAlPiUKICBsZWZ0X2pvaW4oZGVwcmVzc2l2ZV9kaXNvcmRlcnMsIGJ5ID0gImNvdW50cnkiKSAlPiUKICBsZWZ0X2pvaW4oYXV0aXNtdXNfc3BlY3RydW1fZGlzb3JkZXJzLCBieSA9ICJjb3VudHJ5IikgJT4lCiAgbGVmdF9qb2luKGNvbmR1Y3RfZGlzb3JkZXJzLCBieSA9ICJjb3VudHJ5IikgJT4lCiAgbGVmdF9qb2luKHNjaGl6b3BocmVuaWEsIGJ5ID0gImNvdW50cnkiKSAlPiUKICBsZWZ0X2pvaW4oZWF0aW5nX2Rpc29yZGVycywgYnkgPSAiY291bnRyeSIpICU+JQogIGxlZnRfam9pbihiaXBvbGFyX2Rpc29yZGVyLCBieSA9ICJjb3VudHJ5IikgJT4lCiAgbGVmdF9qb2luKGRydWdfdXNlX2Rpc29yZGVycywgYnkgPSAiY291bnRyeSIpICU+JQogIGxlZnRfam9pbihhbGNvaG9sX3VzZV9kaXNvcmRlcnMsIGJ5ID0gImNvdW50cnkiKSAlPiUKICBsZWZ0X2pvaW4oc3Vic3RhbmNlX3VzZV9kaXNvcmRlcnMsIGJ5ID0gImNvdW50cnkiKSAlPiUKICBsZWZ0X2pvaW4obWFqb3JfZGVwcmVzc2l2ZV9kaXNvcmRlciwgYnkgPSAiY291bnRyeSIpICU+JQogIGxlZnRfam9pbihkeXN0aHltaWEsIGJ5ID0gImNvdW50cnkiKQoKIyBEaXNwbGF5IHRoZSByZXN1bHRpbmcgZGF0YSBmcmFtZQpwcmludChmaW5hbF9tZW50YWxfaGVhbHRoX2luZGV4KQoKIyBTaG93IHRoZSBmaXJzdCBmZXcgcm93cyBvZiB0aGUgcmVzdWx0aW5nIGRhdGEgZnJhbWUKaGVhZChmaW5hbF9tZW50YWxfaGVhbHRoX2luZGV4KQoKYGBgCmBgYHtyfQppbmRpY2F0b3JzIDwtIGxlZnRfam9pbihmaW5hbF9tZW50YWxfaGVhbHRoX2luZGV4LCBoYXJkc2hpcCwgYnkgPSAiY291bnRyeSIpCmluZGljYXRvcnMKaGVhZChpbmRpY2F0b3JzKQoKbmV3X2RhdGEgPC0gbGVmdF9qb2luIChXVlNfZGF0YSwgaW5kaWNhdG9ycywgYnkgPSAiY291bnRyeSIpCm5ld19kYXRhCgoKIyBUcmFuc2Zyb20gcmlzayBpdGVtIHN1Y2ggdGhhdCBoaWdoIHZhbHVlcyByZXByZXNlbnQgbW9yZSByaXNrIHRha2luZwpuZXdfZGF0YSRyaXNrdGFraW5nID0gNiAtIG5ld19kYXRhJHJpc2t0YWtpbmcgKyAxCgogIAojIFRyYW5zZm9ybSByaXNrIHZhcmlhYmxlIGludG8gVC1zY29yZSAobWVhbiA9IDUwLCBzZCA9IDEwKQpuZXdfZGF0YSRUX3Njb3JlX3Jpc2t0YWtpbmcgPSAxMCpzY2FsZShuZXdfZGF0YSRyaXNrdGFraW5nLCBjZW50ZXI9VFJVRSxzY2FsZT1UUlVFKSs1MAoKbmV3X2RhdGEKCiNUcmFuc2Zvcm0gcmlzayB2YXJpYWJsZSBpbnRvIFogc2NvcmUgCgojIEFzc3VtaW5nIFQtc2NvcmVzIGhhdmUgYSBtZWFuIG9mIDUwIGFuZCBhIHN0YW5kYXJkIGRldmlhdGlvbiBvZiAxMApuZXdfZGF0YSRaX3Njb3JlX3Jpc2t0YWtpbmcgPSAobmV3X2RhdGEkVF9zY29yZV9yaXNrdGFraW5nIC0gNTApIC8gMTAKCiMgUHJpbnQgdGhlIHJlc3VsdGluZyBkYXRhIGZyYW1lCnByaW50KG5ld19kYXRhKQoKbmV3X2RhdGEgPC0gbmV3X2RhdGEgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgbXV0YXRlKHpfc2NvcmVfYWdlID0gc2NhbGUoYWdlKSkKbmV3X2RhdGEKYGBgCmBgYHtyfQpsaWJyYXJ5KGxtZTQpCgpsaWJyYXJ5KGxtZTQpCgptb2RlbCA8LSBsbWVyKFRfc2NvcmVfcmlza3Rha2luZyB+IHNjYWxlKHpfc2NvcmVfYWdlKSAqIG1lbnRhbF9oZWFsdGggKwogICAgICAgICAgICAgICBnZW5kZXIgKiBtZW50YWxfaGVhbHRoICsKICAgICAgICAgICAgICAgZmFjdG9yKG1hcnJpZWQpICsgZmFjdG9yKGNoaWxkcmVuKSArCiAgICAgICAgICAgICAgIGZhY3RvcihlZHVjYXRpb24pICsgZmFjdG9yKGVtcGxveWVkKSArCiAgICAgICAgICAgICAgICgxICsgc2NhbGUoel9zY29yZV9hZ2UpICsgZmFjdG9yKG1hcnJpZWQpICsgZmFjdG9yKGNoaWxkcmVuKSArIAogICAgICAgICAgICAgICAgZmFjdG9yKGVkdWNhdGlvbikgKyBmYWN0b3IoZW1wbG95ZWQpIHwgY291bnRyeSksCiAgICAgICAgICAgICBkYXRhID0gbmV3X2RhdGEpCgoKc3VtbWFyeShtb2RlbCkKCiMgQXNzdW1pbmcgJ21vZGVsJyBpcyBhIGxpbmVhciBtaXhlZC1lZmZlY3RzIG1vZGVsIChsbWVyKSwgYW5kIHlvdSB3YW50IHRvIHNhdmUgY29lZmZpY2llbnRzIHRvIGEgQ1NWIGZpbGUKCiMgRXh0cmFjdCBjb2VmZmljaWVudHMgZnJvbSB0aGUgbW9kZWwgc3VtbWFyeQpjb2VmZmljaWVudHNfZGYgPC0gZGF0YS5mcmFtZShzdW1tYXJ5KG1vZGVsKSRjb2VmZmljaWVudHMpCgojIFdyaXRlIGNvZWZmaWNpZW50cyB0byBhIENTViBmaWxlCndyaXRlLmNzdihjb2VmZmljaWVudHNfZGYsICJtb2RlbF9jb2VmZmljaWVudHMuY3N2Iiwgcm93Lm5hbWVzID0gVFJVRSkKCmBgYAoKCmBgYAoKCgo=
=======
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKVGhpcyBpcyBhbiBbUiBNYXJrZG93bl0oaHR0cDovL3JtYXJrZG93bi5yc3R1ZGlvLmNvbSkgTm90ZWJvb2suIFdoZW4geW91IGV4ZWN1dGUgY29kZSB3aXRoaW4gdGhlIG5vdGVib29rLCB0aGUgcmVzdWx0cyBhcHBlYXIgYmVuZWF0aCB0aGUgY29kZS4gCgpUcnkgZXhlY3V0aW5nIHRoaXMgY2h1bmsgYnkgY2xpY2tpbmcgdGhlICpSdW4qIGJ1dHRvbiB3aXRoaW4gdGhlIGNodW5rIG9yIGJ5IHBsYWNpbmcgeW91ciBjdXJzb3IgaW5zaWRlIGl0IGFuZCBwcmVzc2luZyAqQ21kK1NoaWZ0K0VudGVyKi4gCgpgYGB7cn0Kcm0obGlzdCA9IGxzKCkpCgpsaWJyYXJ5KGRhdGEudGFibGUpCmxpYnJhcnkodGlkeXIpCmxpYnJhcnkobWFwcykKbGlicmFyeShoYXZlbikKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGRwbHlyKQpgYGAKCkFkZCBhIG5ldyBjaHVuayBieSBjbGlja2luZyB0aGUgKkluc2VydCBDaHVuayogYnV0dG9uIG9uIHRoZSB0b29sYmFyIG9yIGJ5IHByZXNzaW5nICpDbWQrT3B0aW9uK0kqLgoKV2hlbiB5b3Ugc2F2ZSB0aGUgbm90ZWJvb2ssIGFuIEhUTUwgZmlsZSBjb250YWluaW5nIHRoZSBjb2RlIGFuZCBvdXRwdXQgd2lsbCBiZSBzYXZlZCBhbG9uZ3NpZGUgaXQgKGNsaWNrIHRoZSAqUHJldmlldyogYnV0dG9uIG9yIHByZXNzICpDbWQrU2hpZnQrSyogdG8gcHJldmlldyB0aGUgSFRNTCBmaWxlKS4gCgpUaGUgcHJldmlldyBzaG93cyB5b3UgYSByZW5kZXJlZCBIVE1MIGNvcHkgb2YgdGhlIGNvbnRlbnRzIG9mIHRoZSBlZGl0b3IuIENvbnNlcXVlbnRseSwgdW5saWtlICpLbml0KiwgKlByZXZpZXcqIGRvZXMgbm90IHJ1biBhbnkgUiBjb2RlIGNodW5rcy4gSW5zdGVhZCwgdGhlIG91dHB1dCBvZiB0aGUgY2h1bmsgd2hlbiBpdCB3YXMgbGFzdCBydW4gaW4gdGhlIGVkaXRvciBpcyBkaXNwbGF5ZWQuCgpgYGB7cn0KbGlicmFyeShyZWFkeGwpCmhhcmRzaGlwX2NvbXBsZXRlIDwtIHJlYWRfZXhjZWwoIi9Vc2Vycy9jcmlzdGluYWNhbmRpZG8vRG9jdW1lbnRzL0dpdGh1Yi9yaXNrX3d2cy9jb2RlL0hhcmRzaGlwX2NvbXBsZXRlXzIwMjQueGxzeCIpCmhhcmRzaGlwX2NvbXBsZXRlCgoKYGBgCmBgYHtyfQpoYXJkc2hpcF9jb21wbGV0ZSRob21pY2lkZXJhdGU9bG9nKGhhcmRzaGlwX2NvbXBsZXRlJGhvbWljaWRlcmF0ZSkKaGFyZHNoaXBfY29tcGxldGUkZ2RwPWxvZyhoYXJkc2hpcF9jb21wbGV0ZSRnZHApCmhhcmRzaGlwX2NvbXBsZXRlJGluZmFudG1vcnRhbGl0eT1sb2coaGFyZHNoaXBfY29tcGxldGUkaW5mYW50bW9ydGFsaXR5KQpoYXJkc2hpcF9jb21wbGV0ZSRsaWZlZXhwZWN0YW5jeT1sb2coaGFyZHNoaXBfY29tcGxldGUkbGlmZWV4cGVjdGFuY3kpCgpoYXJkc2hpcF9jb21wbGV0ZQoKIyBSZXZlcnNlIENvZGllcnVuZwpoYXJkc2hpcF9jb21wbGV0ZSRob21pY2lkZXJhdGU9c2NhbGUoaGFyZHNoaXBfY29tcGxldGUkaG9taWNpZGVyYXRlKQpoYXJkc2hpcF9jb21wbGV0ZSRnZHA9c2NhbGUoLWhhcmRzaGlwX2NvbXBsZXRlJGdkcCkKaGFyZHNoaXBfY29tcGxldGUkaW5mYW50bW9ydGFsaXR5PXNjYWxlKGhhcmRzaGlwX2NvbXBsZXRlJGluZmFudG1vcnRhbGl0eSkKaGFyZHNoaXBfY29tcGxldGUkbGlmZWV4cGVjdGFuY3k9c2NhbGUoLWhhcmRzaGlwX2NvbXBsZXRlJGxpZmVleHBlY3RhbmN5KQpoYXJkc2hpcF9jb21wbGV0ZSRnaW5pPXNjYWxlKGhhcmRzaGlwX2NvbXBsZXRlJGdpbmkpCmhhcmRzaGlwX2NvbXBsZXRlJGZlbWFsZW1hbGVfcHJpbWVkdT1zY2FsZSgtaGFyZHNoaXBfY29tcGxldGUkZmVtYWxlbWFsZV9wcmltZWR1KQpoYXJkc2hpcF9jb21wbGV0ZQoKaGFyZHNoaXBfY29tcGxldGUkaGFyZHNoaXBfaW5kZXg9KGhhcmRzaGlwX2NvbXBsZXRlJGhvbWljaWRlcmF0ZStoYXJkc2hpcF9jb21wbGV0ZSRnZHAraGFyZHNoaXBfY29tcGxldGUkZ2luaStoYXJkc2hpcF9jb21wbGV0ZSRsaWZlZXhwZWN0YW5jeStoYXJkc2hpcF9jb21wbGV0ZSRpbmZhbnRtb3J0YWxpdHkraGFyZHNoaXBfY29tcGxldGUkZmVtYWxlbWFsZV9wcmltZWR1KS82CgpoYXJkc2hpcF9jb21wbGV0ZQoKIyBMYXVyYSBhZGRlZCB0aGlzIGNvZGUKbGlicmFyeShkcGx5cikKCiMgSW1wdXRlIG1pc3NpbmcgdmFsdWVzIGluIHRoZSBoYXJkc2hpcCBpbmRpY2F0b3JzIHVzaW5nIHRoZSBtZWRpYW4KaGFyZHNoaXBfY29tcGxldGUgPC0gaGFyZHNoaXBfY29tcGxldGUgJT4lCiAgbXV0YXRlKGFjcm9zcyhjKCJob21pY2lkZXJhdGUiLCAiZ2RwIiwgImluZmFudG1vcnRhbGl0eSIsICJsaWZlZXhwZWN0YW5jeSIsICJnaW5pIiwgImZlbWFsZW1hbGVfcHJpbWVkdSIpLAogICAgICAgICAgICAgICAgfmlmZWxzZShpcy5uYSguKSwgbWVkaWFuKC4sIG5hLnJtID0gVFJVRSksIC4pKSkKCmhhcmRzaGlwX2NvbXBsZXRlCgojIFVzZSB0aGUgbXV0YXRlIGZ1bmN0aW9uIHRvIGNoYW5nZSB0aGUgY291bnRyeSBuYW1lCmhhcmRzaGlwX2NvbXBsZXRlIDwtIGhhcmRzaGlwX2NvbXBsZXRlICU+JQogIG11dGF0ZShjb3VudHJ5ID0gaWZlbHNlKGxhYmVsID09ICJTZXJiaWEgYW5kIE1vbnRlbmVncm8iLCAiU2VyYmlhIiwgbGFiZWwpKQpoYXJkc2hpcF9jb21wbGV0ZQpgYGAKCgpgYGB7cn0KIyBEYXRhIG9mIFdhdmUgNQoKCldWNV9kYXRhIDwtIHJlYWRSRFMoIi9Vc2Vycy9jcmlzdGluYWNhbmRpZG8vRG9jdW1lbnRzL0dpdGh1Yi9yaXNrX3d2cy9kYXRhL1dWUy9GMDAwMDc5NDQtV1Y1X0RhdGFfUl92MjAxODA5MTIucmRzIikKCgojIENvbnZlcnQgV1Y1X2RhdGEtb2JqZWN0IGluIGRhdGEuZnJhbWUgCldWNV9kYXRhX2RmIDwtIGFzLmRhdGEuZnJhbWUoV1Y1X2RhdGEpCgojIHNob3cgZmlyc3QgZml2ZSBjb2x1bW5zCldWNV9kYXRhX2RmCmBgYAoKCgpgYGB7cn0KI3JlbmFtZSB0aGUgdmFyaWFibGVzCldWNV9kYXRhIDwtIFdWNV9kYXRhX2RmICU+JQogIHJlbmFtZShnZW5kZXIgPSBWMjM1LCBhZ2UgPSBWMjM3LCBjb3VudHJ5X2NvZGUgPSBWMiwgd2F2ZSA9IFYxLCByaXNrdGFraW5nID0gVjg2LCBjaGlsZHJlbiA9IFY1NiwgbWFycmllZCA9IFY1NSwgZW1wbG95ZWQgPSBWMjQxLCBlZHVjYXRpb24gPSBWMjM4KQpXVjVfZGF0YQoKY29sbmFtZXMoV1Y1X2RhdGEpCgoKCiNzZWxlY3Qgb25seSB0aGUgdmFyaWFibGVzIG9mIGludGVyZXN0CldWNV9kYXRhIDwtIFdWNV9kYXRhICU+JQogIGRwbHlyOjpzZWxlY3QoZ2VuZGVyLCBhZ2UsIGNvdW50cnlfY29kZSwgd2F2ZSwgcmlza3Rha2luZywgY2hpbGRyZW4sIG1hcnJpZWQsIGVtcGxveWVkLCBlZHVjYXRpb24pCldWNV9kYXRhCmBgYApgYGB7cn0KIyBSZWFkIGNvdW50cnluYW1lcyBkYXRhIGZyb20gdGhlIENTViBmaWxlICh0byBkZWNvZGUgdGhlIGRhdGFzZXQgNSkKY291bnRyeW5hbWVzIDwtIHJlYWQuY3N2KCIvVXNlcnMvY3Jpc3RpbmFjYW5kaWRvL0RvY3VtZW50cy9HaXRodWIvcmlza193dnMvZGF0YS9XVlMvY291bnRyeW5hbWVzLnR4dCIsIGhlYWRlciA9IEZBTFNFLCBhcy5pcyA9IFRSVUUpCmNvbG5hbWVzKGNvdW50cnluYW1lcykgPC0gYygiY29kZSIsICJuYW1lIikKCiMgQXNzdW1pbmcgV1Y1X2RhdGEgaGFzIGEgY29sdW1uIG5hbWVkIGNvdW50cnlfY29kZQpXVjVfZGF0YSRjb3VudHJ5IDwtIGNvdW50cnluYW1lcyRuYW1lW21hdGNoKFdWNV9kYXRhJGNvdW50cnlfY29kZSwgY291bnRyeW5hbWVzJGNvZGUpXQoKIyBDaGVjayB0aGUgZnJlcXVlbmN5IG9mIGVhY2ggY291bnRyeSBpbiB0aGUgbmV3IGNvbHVtbgp0YWJsZShXVjVfZGF0YSRjb3VudHJ5KQoKIyBEaXNwbGF5IHRoZSB1cGRhdGVkIFdWNV9kYXRhCnByaW50KFdWNV9kYXRhKQpgYGAKYGBge3J9CiNSZWFkIERhdGFzZXQgKFdhdmUgNikKCldWNl9kYXRhIDwtIGxvYWQoIi9Vc2Vycy9jcmlzdGluYWNhbmRpZG8vRG9jdW1lbnRzL0dpdGh1Yi9yaXNrX3d2cy9kYXRhL1dWUy9XVjZfRGF0YV9SX3YyMDIwMTExNy5yZGF0YSIpIApXVjZfZGF0YSA8LSBXVjZfRGF0YV9SX3YyMDIwMTExNyAKcHJpbnQoV1Y2X2RhdGEpCmBgYAoKYGBge3J9CldWNl9kYXRhIDwtIFdWNl9kYXRhICU+JQogIHJlbmFtZSh3YXZlID0gVjEsIGdlbmRlciA9IFYyNDAsIGFnZSA9IFYyNDIsY291bnRyeV9jb2RlID0gVjIsIHJpc2t0YWtpbmcgPSBWNzYsIGNoaWxkcmVuID0gVjU4LCBtYXJyaWVkID0gVjU3LCBlbXBsb3llZCA9IFYyMjksIGVkdWNhdGlvbiA9IFYyNDgpCgoKI3NlbGVjdCBvbmx5IHRoZSB2YXJpYWJsZXMgb2YgaW50ZXJlc3QKCldWNl9kYXRhIDwtIFdWNl9kYXRhICU+JQogIGRwbHlyOjpzZWxlY3Qod2F2ZSwgZ2VuZGVyLCBhZ2UsIGNvdW50cnlfY29kZSxyaXNrdGFraW5nLCBjaGlsZHJlbiwgbWFycmllZCwgZW1wbG95ZWQsIGVkdWNhdGlvbikKV1Y2X2RhdGEKYGBgCmBgYHtyfQpjb3VudHJ5bmFtZXMgPSByZWFkLmNzdigiL1VzZXJzL2NyaXN0aW5hY2FuZGlkby9Eb2N1bWVudHMvR2l0aHViL3Jpc2tfd3ZzL2RhdGEvV1ZTL2NvdW50cnluYW1lcy50eHQiLCBoZWFkZXI9RkFMU0UsYXMuaXM9VFJVRSkKY29sbmFtZXMoY291bnRyeW5hbWVzKSA9IGMoImNvZGUiLCAibmFtZSIpCldWNl9kYXRhJGNvdW50cnkgPSBjb3VudHJ5bmFtZXMkbmFtZSBbbWF0Y2goV1Y2X2RhdGEkY291bnRyeV9jb2RlLCBjb3VudHJ5bmFtZXMkY29kZSldCnRhYmxlKFdWNl9kYXRhJGNvdW50cnkpCldWNl9kYXRhCmBgYApgYGB7cn0KCldWU19kYXRhID0gcmJpbmQoV1Y1X2RhdGEsIFdWNl9kYXRhKQpXVlNfZGF0YQoKY291bnRyeV9jb3VudHMgPC0gV1ZTX2RhdGEgJT4lCiAgY291bnQoY291bnRyeSkKCiMgUHJpbnQgdGhlIHJlc3VsdApwcmludChjb3VudHJ5X2NvdW50cykKCgoKCgoKCgoKCmBgYApgYGB7cn0KCgoKCldWU19kYXRhID0gc3Vic2V0KFdWU19kYXRhLCByaXNrdGFraW5nID4gMCAmIGdlbmRlciA+IDAgJiBhZ2UgPjAgJiBlZHVjYXRpb24gPiAwICYgZW1wbG95ZWQgPiAwICYgbWFycmllZCA+IDAgJiBjaGlsZHJlbiA+PSAwKQpkYXRhX1dhdmU1ID0gc3Vic2V0KFdWNV9kYXRhLCByaXNrdGFraW5nID4gMCAmIGdlbmRlciA+IDAgJiBhZ2UgPjAgJiBlZHVjYXRpb24gPiAwICYgZW1wbG95ZWQgPiAwICYgbWFycmllZCA+IDAgJiBjaGlsZHJlbiA+PSAwKQpkYXRhX1dhdmU2ID0gc3Vic2V0KFdWNl9kYXRhLCByaXNrdGFraW5nID4gMCAmIGdlbmRlciA+IDAgJiBhZ2UgPjAgJiBlZHVjYXRpb24gPiAwICYgZW1wbG95ZWQgPiAwICYgbWFycmllZCA+IDAgJiBjaGlsZHJlbiA+PSAwKQpXVlNfZGF0YSA8LSBuYS5vbWl0KFdWU19kYXRhKQpkYXRhX1dhdmU1IDwtIG5hLm9taXQoZGF0YV9XYXZlNSkKZGF0YV9XYXZlNiA8LSBuYS5vbWl0KGRhdGFfV2F2ZTYpCgoKCgoKCgoKCiMgVXNlIHRoZSBtdXRhdGUgZnVuY3Rpb24gdG8gY2hhbmdlIHRoZSBjb3VudHJ5IG5hbWUKV1ZTX2RhdGEgPC0gV1ZTX2RhdGEgJT4lCiAgbXV0YXRlKGNvdW50cnkgPSBpZmVsc2UoY291bnRyeSA9PSAiR3JlYXQgQnJpdGFpbiIsICJVbml0ZWQgS2luZ2RvbSIsIGNvdW50cnkpKQpgYGAKYGBge3J9CiMgVHJhbnNmcm9tIHJpc2sgaXRlbSBzdWNoIHRoYXQgaGlnaCB2YWx1ZXMgcmVwcmVzZW50IG1vcmUgcmlzayB0YWtpbmcKV1ZTX2RhdGEkcmlza3Rha2luZyA9IDYgLSBXVlNfZGF0YSRyaXNrdGFraW5nICsgMQoKICAKIyBUcmFuc2Zvcm0gcmlzayB2YXJpYWJsZSBpbnRvIFQtc2NvcmUgKG1lYW4gPSA1MCwgc2QgPSAxMCkKV1ZTX2RhdGEkVF9zY29yZV9yaXNrdGFraW5nID0gMTAqc2NhbGUoV1ZTX2RhdGEkcmlza3Rha2luZywgY2VudGVyPVRSVUUsc2NhbGU9VFJVRSkrNTAKCldWU19kYXRhCgojVHJhbnNmb3JtIHJpc2sgdmFyaWFibGUgaW50byBaIHNjb3JlIAoKIyBBc3N1bWluZyBULXNjb3JlcyBoYXZlIGEgbWVhbiBvZiA1MCBhbmQgYSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgMTAKV1ZTX2RhdGEkWl9zY29yZV9yaXNrdGFraW5nID0gKFdWU19kYXRhJFRfc2NvcmVfcmlza3Rha2luZyAtIDUwKSAvIDEwCgojIFByaW50IHRoZSByZXN1bHRpbmcgZGF0YSBmcmFtZQpwcmludChXVlNfZGF0YSkKCldWU19kYXRhIDwtIFdWU19kYXRhICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIG11dGF0ZSh6X3Njb3JlX2FnZSA9IHNjYWxlKGFnZSkpCldWU19kYXRhCgpjb3VudHJ5X2NvdW50cyA8LSBXVlNfZGF0YSAlPiUKICBjb3VudChjb3VudHJ5KQoKIyBQcmludCB0aGUgcmVzdWx0CnByaW50KGNvdW50cnlfY291bnRzKQoKCgoKYGBgCgpgYGB7cn0KCldWU19kYXRhJGdlbmRlciA9IGlmZWxzZShXVlNfZGF0YSRnZW5kZXIgPT0gMSwgMCwgMSkgIyBzZXg6IG1hbGUgdnMuIGZlbWFsZQpXVlNfZGF0YSRjaGlsZHJlbiA9IGlmZWxzZShXVlNfZGF0YSRjaGlsZHJlbiA9PSAwLCAwLCAxKSAjIGNoaWxkcmVuOiBubyB2cy4geWVzCldWU19kYXRhJG1hcnJpZWQgPSBpZmVsc2UoV1ZTX2RhdGEkbWFycmllZCA9PSAxLCAxLCAwKSAjIG1hcnJpZWQ6IHllcyB2cy4gbm8KV1ZTX2RhdGEkZW1wbG95ZWQgPSBpZmVsc2UoV1ZTX2RhdGEkZW1wbG95ZWQgPCA0LCAxLCAwKSAjIGVtcGxveWVkOiB5ZXMgdnMuIG5vCldWU19kYXRhJGVkdWNhdGlvbiA9IGlmZWxzZShXVlNfZGF0YSRlZHVjYXRpb24gPCA0LCAwLCAxKSAjIGVkdWNhdGlvbjogbm8gcHJpbWFyeSB2cy4gcHJpbWFyeSsgCgoKaGFyZHNoaXAgPC0gaGFyZHNoaXBfY29tcGxldGUgJT4lCiAgZHBseXI6OnNlbGVjdChsYWJlbCwgY29kZSwgaGFyZHNoaXBfaW5kZXgpCmhhcmRzaGlwCgoKCgpgYGAKYGBge3J9CmxpYnJhcnkoZHBseXIpCmhhcmRzaGlwIDwtIHJlbmFtZShoYXJkc2hpcCwgY291bnRyeSA9IGxhYmVsKQoKV1ZTX21peGVkX21vZGVsIDwtIGxlZnRfam9pbihXVlNfZGF0YSwgaGFyZHNoaXAsIGJ5ID0gImNvdW50cnkiKQpXVlNfbWl4ZWRfbW9kZWwKaGVhZChXVlNfbWl4ZWRfbW9kZWwpCgpjb2xuYW1lcyhXVlNfZGF0YSkKY29sbmFtZXMoaGFyZHNoaXApCgp1bmlxdWUoV1ZTX2RhdGEkY291bnRyeSkKCldWU19taXhlZF9tb2RlbAoKdW5pcXVlKFdWU19taXhlZF9tb2RlbCRjb3VudHJ5KQpgYGAKYGBge3J9CmxpYnJhcnkobG1lclRlc3QpCgojIGludGVyY2VwdCBvbmx5IG1vZGVsCm1vZGVsMCA9IGxtZXIoVF9zY29yZV9yaXNrdGFraW5nIH4gMSArICgxfGNvdW50cnkpLGRhdGEgPSBXVlNfZGF0YSkKc3VtbWFyeV9tb2RlbDA9c3VtbWFyeShtb2RlbDApCnN1bW1hcnlfbW9kZWwwCmBgYApgYGB7cn0KIyBhZ2UsIHNleCAKbW9kZWwxID0gbG1lcihUX3Njb3JlX3Jpc2t0YWtpbmcgfiAxICtzY2FsZShhZ2UpK2ZhY3RvcihnZW5kZXIpICsgKDErc2NhbGUoYWdlKStmYWN0b3IoZ2VuZGVyKXxjb3VudHJ5KSxkYXRhID0gV1ZTX21peGVkX21vZGVsLCBjb250cm9sID0gbG1lckNvbnRyb2wob3B0aW1pemVyID0gImJvYnlxYSIpKQpzdW1tYXJ5X21vZGVsMT1zdW1tYXJ5KG1vZGVsMSkKc3VtbWFyeV9tb2RlbDEKYGBgCgpgYGB7cn0KI21vZGVsIDIKbGlicmFyeShsbWU0KQoKbGlicmFyeShsbWU0KQpsaWJyYXJ5KGxtZXJUZXN0KQoKIyBEZWZpbmUgdGhlIGxtZXIgbW9kZWwgYW5kIGFzc2lnbiBpdCB0byAnbW9kZWxfMicKbW9kZWxfMiA8LSBsbWVyKFRfc2NvcmVfcmlza3Rha2luZyB+IDEgKyBzY2FsZShhZ2UpICsgZmFjdG9yKGdlbmRlcikgKyBmYWN0b3IoY2hpbGRyZW4pICsgCiAgICAgICAgICAgICAgICAgZmFjdG9yKG1hcnJpZWQpICsgZmFjdG9yKGVkdWNhdGlvbikgKyBmYWN0b3IoZW1wbG95ZWQpICsKICAgICAgICAgICAgICAgICAoMSArIHNjYWxlKGFnZSkgKyBmYWN0b3IoZ2VuZGVyKSArIGZhY3RvcihjaGlsZHJlbikgKyBmYWN0b3IoZW1wbG95ZWQpICsKICAgICAgICAgICAgICAgICAgZmFjdG9yKG1hcnJpZWQpIHwgY291bnRyeSksCiAgICAgICAgICAgICAgICBkYXRhID0gV1ZTX21peGVkX21vZGVsLCBjb250cm9sID0gbG1lckNvbnRyb2wob3B0aW1pemVyID0gImJvYnlxYSIsIG9wdEN0cmwgPSBsaXN0KG1heGZ1biA9IDEwMDAwMCkpKQoKCiMgRGlzcGxheSB0aGUgc3VtbWFyeSBvZiB0aGUgbW9kZWwKc3VtbWFyeV9tb2RlbF8yID0gc3VtbWFyeShtb2RlbF8yKQpzdW1tYXJ5X21vZGVsXzIKCldWU19taXhlZF9tb2RlbAoKCmBgYAoKCmBgYHtyfQptb2RlbF8zIDwtIGxtZXIoVF9zY29yZV9yaXNrdGFraW5nIH4gMSArIHNjYWxlKGFnZSkgKiBoYXJkc2hpcF9pbmRleCArIAogICAgICAgICAgICAgICAgICAgIGZhY3RvcihnZW5kZXIpICogaGFyZHNoaXBfaW5kZXggKyBmYWN0b3IobWFycmllZCkgKyBmYWN0b3IoY2hpbGRyZW4pICsgCiAgICAgICAgICAgICAgICAgICAgZmFjdG9yKGVkdWNhdGlvbikgKyBmYWN0b3IoZW1wbG95ZWQpICsgCiAgICAgICAgICAgICAgICAgICAgKDEgKyBzY2FsZShhZ2UpICsgZmFjdG9yKG1hcnJpZWQpICsgZmFjdG9yKGNoaWxkcmVuKSArIAogICAgICAgICAgICAgICAgICAgICBmYWN0b3IoZWR1Y2F0aW9uKSArIGZhY3RvcihlbXBsb3llZCkgfCBjb3VudHJ5KSwKICAgICAgICAgICAgICAgIGRhdGEgPSBXVlNfbWl4ZWRfbW9kZWwsY29udHJvbCA9IGxtZXJDb250cm9sKG9wdGltaXplciA9ICJib2J5cWEiLCBvcHRDdHJsID0gbGlzdChtYXhmdW4gPSAxMDAwMDApKSkKCnN1bW1hcnlfbW9kZWxfMyA9IHN1bW1hcnkobW9kZWxfMykgCgpzdW1tYXJ5X21vZGVsXzMKCgpgYGAKCmBgYHtyfQojIERlZmluZSBhbm92YV9yZXN1bHRzIGxpc3Qgd2l0aCBtdWx0aXBsZSBhbm92YSgpIGNhbGxzCmFub3ZhX3Jlc3VsdHMgPC0gbGlzdCgKICBhbm92YShtb2RlbDAsIG1vZGVsMSksCiAgYW5vdmEobW9kZWwxLCBtb2RlbF8yKSwKICBhbm92YShtb2RlbF8yLCBtb2RlbF8zKQopCgphbm92YV9yZXN1bHRzCgpsaWJyYXJ5KGJyb29tKQpsaWJyYXJ5KHRpYmJsZSkKCgoKbGlicmFyeShkcGx5cikKIyBGb3JtYXQgQU5PVkEgcmVzdWx0cyBpbnRvIGEgdGlkeSBkYXRhIGZyYW1lCmFub3ZhX3N1bW1hcnkgPC0gYmluZF9yb3dzKGxhcHBseShhbm92YV9yZXN1bHRzLCB0aWR5KSwgLmlkID0gIkNvbXBhcmlzb24iKQoKIyBQcmludCB0aGUgc3VtbWFyeSB0YWJsZQpwcmludChhbm92YV9zdW1tYXJ5KQoKYGBgCmBgYHtyfQojIEV4dHJhY3QgcmFuZG9tIGVmZmVjdHMgZm9yICdjb3VudHJ5JwojIEFzc3VtaW5nICdtb2RlbCcgaXMgeW91ciBmaXR0ZWQgbG1lciBtb2RlbApyYW5kb21fZWZmZWN0cyA8LSByYW5lZihtb2RlbF8yKQpyYW5kb21fZWZmZWN0cwoKCgoKCgpgYGAKYGBge3J9CnJlZ3Jlc3Npb25fcmVzdWx0c19XVlMgPC0gV1ZTX2RhdGEgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgZG8obW9kZWwgPSBsbShaX3Njb3JlX3Jpc2t0YWtpbmcgfiBzY2FsZShhZ2UpICsgZ2VuZGVyLCBkYXRhID0gLikpICU+JQogIHN1bW1hcml6ZSgKICAgIGNvdW50cnkgPSBmaXJzdChjb3VudHJ5KSwKICAgIGludGVyY2VwdF9yZWdyZXNzaW9uID0gY29lZihzdW1tYXJ5KG1vZGVsKSlbMSwgMV0sCiAgICBzbG9wZV9hZ2VfcmVncmVzc2lvbiA9IGNvZWYoc3VtbWFyeShtb2RlbCkpWzIsIDFdLAogICAgc2xvcGVfZ2VuZGVyX3JlZ3Jlc3Npb24gPSBjb2VmKHN1bW1hcnkobW9kZWwpKVszLCAxXQogICkKCnJlZ3Jlc3Npb25fcmVzdWx0c19XVlMKCnJhbmRvbV9lZmZlY3RzIDwtIHJhbmVmKG1vZGVsXzIpCnJhbmRvbV9lZmZlY3RzCgpjb2xuYW1lcyhyYW5kb21fZWZmZWN0cykKCgoKCgoKCgoKCgoKCgoKCmBgYAoKYGBge3J9CmNvZWZzYWxsbW9kZWxzPXJiaW5kKHN1bW1hcnlfbW9kZWwxJGNvZWZmaWNpZW50cywKc3VtbWFyeV9tb2RlbF8yJGNvZWZmaWNpZW50cywKc3VtbWFyeV9tb2RlbF8zJGNvZWZmaWNpZW50c1tjKDE6Miw0OjgsMyw5OjEwKSxdKQoKd3JpdGUuY3N2KGNvZWZzYWxsbW9kZWxzLCJjb2Vmc2FsbG1vZGVscy5jc3YiKQpgYGAKCgpgYGB7cn0KIyBSZWFkIHRoZSBDU1YgZmlsZSBpbnRvIGEgZGF0YSBmcmFtZQpnYmRfbWVudGFsaGVhbHRoIDwtIHJlYWRfZXhjZWwoIi9Vc2Vycy9jcmlzdGluYWNhbmRpZG8vRG9jdW1lbnRzL0dpdGh1Yi9yaXNrX3d2cy9HQkRfbWVudGFsaGVhbHRoLnhsc3giKQoKZ2JkX21lbnRhbGhlYWx0aAoKI3NlbGVjdCBvbmx5IHRoZSB2YXJpYWJsZXMgb2YgaW50ZXJlc3QKZ2JkX21lbnRhbGhlYWx0aCA8LSBnYmRfbWVudGFsaGVhbHRoICU+JQogIGRwbHlyOjpzZWxlY3QoY291bnRyeSwgZ2VuZGVyLCBhZ2UsIGNhdXNlLCB2YWwsIE1lYXN1cmUpCmdiZF9tZW50YWxoZWFsdGgKCgpsaWJyYXJ5KGRwbHlyKQoKIyBHcm91cCBkYXRhIGJ5IGNvdW50cnkgYW5kIGFnZSBncm91cCwgYW5kIGNhbGN1bGF0ZSBzdW1tYXJ5IHN0YXRpc3RpY3MKc3VtbWFyeV9ieV9jb3VudHJ5X2FnZSA8LSBnYmRfbWVudGFsaGVhbHRoICU+JQogIGdyb3VwX2J5KGNvdW50cnksIGFnZSkgJT4lCiAgc3VtbWFyaXNlKAogICAgbWVhbl9EQUxZcyA9IG1lYW4odmFsKSkgICMgQ2FsY3VsYXRlIG1lYW4gb2YgREFMWXMKCmxpYnJhcnkoZHBseXIpCgojIEFzc3VtaW5nICdzdW1tYXJ5X2J5X2NvdW50cnlfYWdlJyBjb250YWlucyB5b3VyIHN1bW1hcml6ZWQgZGF0YXNldAptZWFuX2J5X2NvdW50cnkgPC0gc3VtbWFyeV9ieV9jb3VudHJ5X2FnZSAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBzdW1tYXJpc2UobWVhbl9EQUxZcyA9IG1lYW4obWVhbl9EQUxZcykpCgojIFZpZXcgdGhlIHJlc3VsdGluZyBtZWFuIGJ5IGNvdW50cnkKcHJpbnQobWVhbl9ieV9jb3VudHJ5KQoKI2xvZyB0cmFuc2Zvcm0KbWVhbl9ieV9jb3VudHJ5JG1lYW5fREFMWXM9bG9nKG1lYW5fYnlfY291bnRyeSRtZWFuX0RBTFlzKQogCm1lYW5fYnlfY291bnRyeSAKCiNSZXZlcnNlIGNvZGllcnVuZyAKbWVhbl9ieV9jb3VudHJ5JG1lYW5fREFMWXM9c2NhbGUobWVhbl9ieV9jb3VudHJ5JG1lYW5fREFMWXMpCgptZWFuX2J5X2NvdW50cnkKCiNyZW5hbWUgbWVhbl9EQUxZUwptZW50YWxfaGVhbHRoX2luZGV4IDwtIG1lYW5fYnlfY291bnRyeSAlPiUKICByZW5hbWUoJ21lbnRhbF9oZWFsdGgnID0gbWVhbl9EQUxZcykKbWVudGFsX2hlYWx0aF9pbmRleAoKYGBgCmBgYHtyfQpsaWJyYXJ5KGRwbHlyKQoKIyMjIyMjI0FueGlldHkgZGlzb3JkZXJzIyMjIyMjIyMjCiNGaWx0ZXIgZGF0YSBmb3IgYSBzcGVjaWZpYyBtZW50YWwgZGlzb3JkZXIgKGUuZy4sIEFueGlldHkgRGlzb3JkZXJzKQphbnhpZXR5X2Rpc29yZGVycyA8LSBnYmRfbWVudGFsaGVhbHRoICU+JQogIGZpbHRlcihjYXVzZSA9PSAiQW54aWV0eSBkaXNvcmRlcnMiKSAgIyBDaGFuZ2UgIkFueGlldHkgRGlzb3JkZXJzIiB0byB0aGUgZGVzaXJlZCBkaXNvcmRlcgoKIyBDYWxjdWxhdGUgdGhlIG1lYW4gb2YgJ3ZhbCcgKERpc2FiaWxpdHktQWRqdXN0ZWQgTGlmZSBZZWFycykgYWNyb3NzIGxvY2F0aW9ucyBhbmQgYWdlcwptZWFuX0RBTFlzIDwtIG1lYW4oYW54aWV0eV9kaXNvcmRlcnMkdmFsKQoKIyBPcHRpb25hbGx5LCBpZiB5b3Ugd2FudCB0byBjYWxjdWxhdGUgbWVhbiBieSBjb3VudHJ5OgphbnhpZXR5X2Rpc29yZGVycyA8LSBhbnhpZXR5X2Rpc29yZGVycyAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBzdW1tYXJpc2UobWVhbl9BbnhpZXR5X2Rpc29yZGVycyA9IG1lYW4odmFsKSkKCmFueGlldHlfZGlzb3JkZXJzCgojbG9nIHRyYW5zZm9ybQphbnhpZXR5X2Rpc29yZGVycyRtZWFuX0FueGlldHlfZGlzb3JkZXJzPWxvZyhhbnhpZXR5X2Rpc29yZGVycyRtZWFuX0FueGlldHlfZGlzb3JkZXJzKQogCmFueGlldHlfZGlzb3JkZXJzCgojUmV2ZXJzZSBjb2RpZXJ1bmcgCmFueGlldHlfZGlzb3JkZXJzJG1lYW5fQW54aWV0eV9kaXNvcmRlcnM9c2NhbGUoYW54aWV0eV9kaXNvcmRlcnMkbWVhbl9BbnhpZXR5X2Rpc29yZGVycykKYW54aWV0eV9kaXNvcmRlcnMKbWVudGFsX2hlYWx0aF9pbmRleAoKYGBgCmBgYHtyfQpnYmRfbWVudGFsaGVhbHRoCgojIEFzc3VtaW5nIGdiZF9tZW50YWxoZWFsdGggaXMgeW91ciBkYXRhIGZyYW1lIGNvbnRhaW5pbmcgdGhlICdjYXVzZScgY29sdW1uCgojIEdldCB1bmlxdWUgdmFsdWVzIG9mICdjYXVzZScgY29sdW1uCnVuaXF1ZV9jYXVzZXMgPC0gdW5pcXVlKGdiZF9tZW50YWxoZWFsdGgkY2F1c2UpCgojIENyZWF0ZSBhIGRhdGEgZnJhbWUgd2l0aCB1bmlxdWUgY2F1c2VzCmNhdXNlX3RhYmxlIDwtIGRhdGEuZnJhbWUoQ2F1c2UgPSB1bmlxdWVfY2F1c2VzKQoKIyBQcmludCB0aGUgY2F1c2UgdGFibGUKcHJpbnQoY2F1c2VfdGFibGUpCgoKYGBgCmBgYHtyfQojIyMjIyMjQnVsaW1pYSBuZXJ2b3NhIyMjIyMjIyMKbGlicmFyeShkcGx5cikKCiMgRmlsdGVyIHRoZSBkYXRhIGZvciAnQnVsaW1pYSBOZXJ2b3NhJwpidWxpbWlhX25lcnZvc2EgPC0gZ2JkX21lbnRhbGhlYWx0aCAlPiUKICBmaWx0ZXIoY2F1c2UgPT0gIkJ1bGltaWEgbmVydm9zYSIpCgojIENhbGN1bGF0ZSB0aGUgbWVhbiBvZiAndmFsJyAoREFMWXMpIGFjcm9zcyBhbGwgbG9jYXRpb25zCm1lYW5fREFMWXMgPC0gbWVhbihidWxpbWlhX25lcnZvc2EkdmFsKQoKIyBPcHRpb25hbGx5LCBjYWxjdWxhdGUgbWVhbiBieSBjb3VudHJ5CmJ1bGltaWFfbmVydm9zYSA8LSBidWxpbWlhX25lcnZvc2EgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgc3VtbWFyaXNlKG1lYW5fYnVsaW1pYV9uZXJ2b3NhID0gbWVhbih2YWwpKQoKIyBMb2cgdHJhbnNmb3JtIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4KYnVsaW1pYV9uZXJ2b3NhJG1lYW5fYnVsaW1pYV9uZXJ2b3NhIDwtIGxvZyhidWxpbWlhX25lcnZvc2EkbWVhbl9idWxpbWlhX25lcnZvc2EpCgojIFNjYWxlIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4gKGlmIG5lZWRlZCkKYnVsaW1pYV9uZXJ2b3NhJG1lYW5fYnVsaW1pYV9uZXJ2b3NhIDwtIHNjYWxlKGJ1bGltaWFfbmVydm9zYSRtZWFuX2J1bGltaWFfbmVydm9zYSkKCiMgUHJpbnQgdGhlIHJlc3VsdGluZyBkYXRhIGZyYW1lCnByaW50KGJ1bGltaWFfbmVydm9zYSkKcHJpbnQoYW54aWV0eV9kaXNvcmRlcnMpCgpnYmRfbWVudGFsaGVhbHRoCgpgYGAKYGBge3J9CiMjIyMjQXR0ZW50aW9uLWRlZmljaXQvaHlwZXJhY3Rpdml0eSBkaXNvcmRlcgpsaWJyYXJ5KGRwbHlyKQoKCkFESEQgPC0gZ2JkX21lbnRhbGhlYWx0aCAlPiUKICBmaWx0ZXIoY2F1c2UgPT0gIkF0dGVudGlvbi1kZWZpY2l0L2h5cGVyYWN0aXZpdHkgZGlzb3JkZXIiKQoKIyBDYWxjdWxhdGUgdGhlIG1lYW4gb2YgJ3ZhbCcgKERBTFlzKSBhY3Jvc3MgYWxsIGxvY2F0aW9ucwptZWFuX0RBTFlzIDwtIG1lYW4oQURIRCR2YWwpCgojIE9wdGlvbmFsbHksIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnkKQURIRCA8LSBBREhEICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIHN1bW1hcmlzZShtZWFuX0FESEQgPSBtZWFuKHZhbCkpCgojIExvZyB0cmFuc2Zvcm0gdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbgpBREhEJG1lYW5fQURIRCA8LSBsb2coQURIRCRtZWFuX0FESEQpCgojIFNjYWxlIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4gKGlmIG5lZWRlZCkKQURIRCRtZWFuX0FESEQgPC0gc2NhbGUoQURIRCRtZWFuX0FESEQpCgojIFByaW50IHRoZSByZXN1bHRpbmcgZGF0YSBmcmFtZQpwcmludChBREhEKQoKYGBgCmBgYHtyfQojIyMjIyMjIyNJZGlvcGF0aGljIGRldmVsb3BtZW50IGludGVsbGVjdHVhbCBhYmlsaXR5IApsaWJyYXJ5KGRwbHlyKQoKCklkaW9wYXRoaWNfZGV2ZWxvcG1lbnRhbF9pbnRlbGxlY3R1YWxfZGlzYWJpbGl0eSA8LSBnYmRfbWVudGFsaGVhbHRoICU+JQogIGZpbHRlcihjYXVzZSA9PSAiSWRpb3BhdGhpYyBkZXZlbG9wbWVudGFsIGludGVsbGVjdHVhbCBkaXNhYmlsaXR5IikKCiMgQ2FsY3VsYXRlIHRoZSBtZWFuIG9mICd2YWwnIChEQUxZcykgYWNyb3NzIGFsbCBsb2NhdGlvbnMKbWVhbl9EQUxZcyA8LSBtZWFuKElkaW9wYXRoaWNfZGV2ZWxvcG1lbnRhbF9pbnRlbGxlY3R1YWxfZGlzYWJpbGl0eSR2YWwpCgojIE9wdGlvbmFsbHksIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnkKSWRpb3BhdGhpY19kZXZlbG9wbWVudGFsX2ludGVsbGVjdHVhbF9kaXNhYmlsaXR5IDwtIElkaW9wYXRoaWNfZGV2ZWxvcG1lbnRhbF9pbnRlbGxlY3R1YWxfZGlzYWJpbGl0eSAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBzdW1tYXJpc2UobWVhbl9JZGlvcGF0aGljX2RldmVsb3BtZW50YWxfaW50ZWxsZWN0dWFsX2Rpc2FiaWxpdHkgPSBtZWFuKHZhbCkpCgojIExvZyB0cmFuc2Zvcm0gdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbgpJZGlvcGF0aGljX2RldmVsb3BtZW50YWxfaW50ZWxsZWN0dWFsX2Rpc2FiaWxpdHkkbWVhbl9JZGlvcGF0aGljX2RldmVsb3BtZW50YWxfaW50ZWxsZWN0dWFsX2Rpc2FiaWxpdHkgPC0gbG9nKElkaW9wYXRoaWNfZGV2ZWxvcG1lbnRhbF9pbnRlbGxlY3R1YWxfZGlzYWJpbGl0eSRtZWFuX0lkaW9wYXRoaWNfZGV2ZWxvcG1lbnRhbF9pbnRlbGxlY3R1YWxfZGlzYWJpbGl0eSkKCiMgU2NhbGUgdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbiAoaWYgbmVlZGVkKQpJZGlvcGF0aGljX2RldmVsb3BtZW50YWxfaW50ZWxsZWN0dWFsX2Rpc2FiaWxpdHkkbWVhbl9JZGlvcGF0aGljX2RldmVsb3BtZW50YWxfaW50ZWxsZWN0dWFsX2Rpc2FiaWxpdHkgPC0gc2NhbGUoSWRpb3BhdGhpY19kZXZlbG9wbWVudGFsX2ludGVsbGVjdHVhbF9kaXNhYmlsaXR5JG1lYW5fSWRpb3BhdGhpY19kZXZlbG9wbWVudGFsX2ludGVsbGVjdHVhbF9kaXNhYmlsaXR5KQoKIyBQcmludCB0aGUgcmVzdWx0aW5nIGRhdGEgZnJhbWUKcHJpbnQoSWRpb3BhdGhpY19kZXZlbG9wbWVudGFsX2ludGVsbGVjdHVhbF9kaXNhYmlsaXR5KQpgYGAKYGBge3J9CiMjIyMjI0Fub3JleGlhIE5lcnZvc2EKCmFub3JleGlhX25lcnZvc2EgPC0gZ2JkX21lbnRhbGhlYWx0aCAlPiUKICBmaWx0ZXIoY2F1c2UgPT0gIkFub3JleGlhIG5lcnZvc2EiKQoKIyBDYWxjdWxhdGUgdGhlIG1lYW4gb2YgJ3ZhbCcgKERBTFlzKSBhY3Jvc3MgYWxsIGxvY2F0aW9ucwptZWFuX0RBTFlzIDwtIG1lYW4oYW5vcmV4aWFfbmVydm9zYSR2YWwpCgojIE9wdGlvbmFsbHksIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnkKYW5vcmV4aWFfbmVydm9zYSA8LSBhbm9yZXhpYV9uZXJ2b3NhICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIHN1bW1hcmlzZShtZWFuX2Fub3JleGlhX25lcnZvc2EgPSBtZWFuKHZhbCkpCgojIExvZyB0cmFuc2Zvcm0gdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbgphbm9yZXhpYV9uZXJ2b3NhJG1lYW5fYW5vcmV4aWFfbmVydm9zYSA8LSBsb2coYW5vcmV4aWFfbmVydm9zYSRtZWFuX2Fub3JleGlhX25lcnZvc2EpCgojIFNjYWxlIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4gKGlmIG5lZWRlZCkKYW5vcmV4aWFfbmVydm9zYSRtZWFuX2Fub3JleGlhX25lcnZvc2EgPC0gc2NhbGUoYW5vcmV4aWFfbmVydm9zYSRtZWFuX2Fub3JleGlhX25lcnZvc2EpCgojIFByaW50IHRoZSByZXN1bHRpbmcgZGF0YSBmcmFtZQpwcmludChhbm9yZXhpYV9uZXJ2b3NhKQpgYGAKYGBge3J9CiMjIyMjRGVwcmVzc2l2ZSBkaXNvcmRlcnMjIyMjIyMjCgpkZXByZXNzaXZlX2Rpc29yZGVycyA8LSBnYmRfbWVudGFsaGVhbHRoICU+JQogIGZpbHRlcihjYXVzZSA9PSAiRGVwcmVzc2l2ZSBkaXNvcmRlcnMiKQoKIyBDYWxjdWxhdGUgdGhlIG1lYW4gb2YgJ3ZhbCcgKERBTFlzKSBhY3Jvc3MgYWxsIGxvY2F0aW9ucwptZWFuX0RBTFlzIDwtIG1lYW4oZGVwcmVzc2l2ZV9kaXNvcmRlcnMkdmFsKQoKIyBPcHRpb25hbGx5LCBjYWxjdWxhdGUgbWVhbiBieSBjb3VudHJ5CmRlcHJlc3NpdmVfZGlzb3JkZXJzIDwtIGRlcHJlc3NpdmVfZGlzb3JkZXJzICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIHN1bW1hcmlzZShtZWFuX2RlcHJlc3NpdmVfZGlzb3JkZXJzID0gbWVhbih2YWwpKQoKIyBMb2cgdHJhbnNmb3JtIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4KZGVwcmVzc2l2ZV9kaXNvcmRlcnMkbWVhbl9kZXByZXNzaXZlX2Rpc29yZGVycyA8LSBsb2coZGVwcmVzc2l2ZV9kaXNvcmRlcnMkbWVhbl9kZXByZXNzaXZlX2Rpc29yZGVycykKCiMgU2NhbGUgdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbiAoaWYgbmVlZGVkKQpkZXByZXNzaXZlX2Rpc29yZGVycyRtZWFuX2RlcHJlc3NpdmVfZGlzb3JkZXJzIDwtIHNjYWxlKGRlcHJlc3NpdmVfZGlzb3JkZXJzJG1lYW5fZGVwcmVzc2l2ZV9kaXNvcmRlcnMpCgojIFByaW50IHRoZSByZXN1bHRpbmcgZGF0YSBmcmFtZQpwcmludChkZXByZXNzaXZlX2Rpc29yZGVycykKYGBgCgpgYGB7cn0KIyMjIyMjI0F1dGlzbXVzIHNwZWN0cnVtIGRpc29yZGVycyMjIyMjIwoKYXV0aXNtdXNfc3BlY3RydW1fZGlzb3JkZXJzIDwtIGdiZF9tZW50YWxoZWFsdGggJT4lCiAgZmlsdGVyKGNhdXNlID09ICJBdXRpc20gc3BlY3RydW0gZGlzb3JkZXJzIikKCiMgQ2FsY3VsYXRlIHRoZSBtZWFuIG9mICd2YWwnIChEQUxZcykgYWNyb3NzIGFsbCBsb2NhdGlvbnMKbWVhbl9EQUxZcyA8LSBtZWFuKGF1dGlzbXVzX3NwZWN0cnVtX2Rpc29yZGVycyR2YWwpCgojIE9wdGlvbmFsbHksIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnkKYXV0aXNtdXNfc3BlY3RydW1fZGlzb3JkZXJzIDwtIGF1dGlzbXVzX3NwZWN0cnVtX2Rpc29yZGVycyAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBzdW1tYXJpc2UobWVhbl9hdXRpc211c19zcGVjdHJ1bV9kaXNvcmRlcnMgPSBtZWFuKHZhbCkpCgojIExvZyB0cmFuc2Zvcm0gdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbgphdXRpc211c19zcGVjdHJ1bV9kaXNvcmRlcnMkbWVhbl9hdXRpc211c19zcGVjdHJ1bV9kaXNvcmRlcnMgPC0gbG9nKGF1dGlzbXVzX3NwZWN0cnVtX2Rpc29yZGVycyRtZWFuX2F1dGlzbXVzX3NwZWN0cnVtX2Rpc29yZGVycykKCiMgU2NhbGUgdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbiAoaWYgbmVlZGVkKQphdXRpc211c19zcGVjdHJ1bV9kaXNvcmRlcnMkbWVhbl9hdXRpc211c19zcGVjdHJ1bV9kaXNvcmRlcnMgPC0gc2NhbGUoYXV0aXNtdXNfc3BlY3RydW1fZGlzb3JkZXJzJG1lYW5fYXV0aXNtdXNfc3BlY3RydW1fZGlzb3JkZXJzKQoKIyBQcmludCB0aGUgcmVzdWx0aW5nIGRhdGEgZnJhbWUKcHJpbnQoYXV0aXNtdXNfc3BlY3RydW1fZGlzb3JkZXJzKQpgYGAKCmBgYHtyfQojIyMjIyNTY2hpem9waHJlbmlhIyMjIyMjIwpzY2hpem9waHJlbmlhIDwtIGdiZF9tZW50YWxoZWFsdGggJT4lCiAgZmlsdGVyKGNhdXNlID09ICJTY2hpem9waHJlbmlhIikKCiMgQ2FsY3VsYXRlIHRoZSBtZWFuIG9mICd2YWwnIChEQUxZcykgYWNyb3NzIGFsbCBsb2NhdGlvbnMKbWVhbl9EQUxZcyA8LSBtZWFuKHNjaGl6b3BocmVuaWEkdmFsKQoKIyBPcHRpb25hbGx5LCBjYWxjdWxhdGUgbWVhbiBieSBjb3VudHJ5CnNjaGl6b3BocmVuaWEgPC0gc2NoaXpvcGhyZW5pYSAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBzdW1tYXJpc2UobWVhbl9zY2hpem9waHJlbmlhID0gbWVhbih2YWwpKQoKIyBMb2cgdHJhbnNmb3JtIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4Kc2NoaXpvcGhyZW5pYSRtZWFuX3NjaGl6b3BocmVuaWEgPC0gbG9nKHNjaGl6b3BocmVuaWEkbWVhbl9zY2hpem9waHJlbmlhKQoKIyBTY2FsZSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uIChpZiBuZWVkZWQpCnNjaGl6b3BocmVuaWEkbWVhbl9zY2hpem9waHJlbmlhIDwtIHNjYWxlKHNjaGl6b3BocmVuaWEkbWVhbl9zY2hpem9waHJlbmlhKQoKIyBQcmludCB0aGUgcmVzdWx0aW5nIGRhdGEgZnJhbWUKcHJpbnQoc2NoaXpvcGhyZW5pYSkKCmBgYAoKYGBge3J9CiMjIyMjIyNDb25kdWN0IGRpc29yZGVycyMjIyMjIyMjIwpjb25kdWN0X2Rpc29yZGVycyA8LSBnYmRfbWVudGFsaGVhbHRoICU+JQogIGZpbHRlcihjYXVzZSA9PSAiQ29uZHVjdCBkaXNvcmRlciIpCgojIENhbGN1bGF0ZSB0aGUgbWVhbiBvZiAndmFsJyAoREFMWXMpIGFjcm9zcyBhbGwgbG9jYXRpb25zCm1lYW5fREFMWXMgPC0gbWVhbihjb25kdWN0X2Rpc29yZGVycyR2YWwpCgojIE9wdGlvbmFsbHksIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnkKY29uZHVjdF9kaXNvcmRlcnMgPC0gY29uZHVjdF9kaXNvcmRlcnMgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgc3VtbWFyaXNlKG1lYW5fY29uZHVjdF9kaXNvcmRlcnMgPSBtZWFuKHZhbCkpCgojIExvZyB0cmFuc2Zvcm0gdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbgpjb25kdWN0X2Rpc29yZGVycyRtZWFuX2NvbmR1Y3RfZGlzb3JkZXJzIDwtIGxvZyhjb25kdWN0X2Rpc29yZGVycyRtZWFuX2NvbmR1Y3RfZGlzb3JkZXJzKQoKIyBTY2FsZSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uIChpZiBuZWVkZWQpCmNvbmR1Y3RfZGlzb3JkZXJzJG1lYW5fY29uZHVjdF9kaXNvcmRlcnMgPC0gc2NhbGUoY29uZHVjdF9kaXNvcmRlcnMkbWVhbl9jb25kdWN0X2Rpc29yZGVycykKCiMgUHJpbnQgdGhlIHJlc3VsdGluZyBkYXRhIGZyYW1lCnByaW50KGNvbmR1Y3RfZGlzb3JkZXJzKQoKCmBgYAoKYGBge3J9CiMjIyMjIyMjRWF0aW5nIGRpc29yZGVycyMjIyMjIyMjIwplYXRpbmdfZGlzb3JkZXJzIDwtIGdiZF9tZW50YWxoZWFsdGggJT4lCiAgZmlsdGVyKGNhdXNlID09ICJFYXRpbmcgZGlzb3JkZXJzIikKCiMgQ2FsY3VsYXRlIHRoZSBtZWFuIG9mICd2YWwnIChEQUxZcykgYWNyb3NzIGFsbCBsb2NhdGlvbnMKbWVhbl9EQUxZcyA8LSBtZWFuKGVhdGluZ19kaXNvcmRlcnMkdmFsKQoKIyBPcHRpb25hbGx5LCBjYWxjdWxhdGUgbWVhbiBieSBjb3VudHJ5CmVhdGluZ19kaXNvcmRlcnMgPC0gZWF0aW5nX2Rpc29yZGVycyAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBzdW1tYXJpc2UobWVhbl9lYXRpbmdfZGlzb3JkZXJzID0gbWVhbih2YWwpKQoKIyBMb2cgdHJhbnNmb3JtIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4KZWF0aW5nX2Rpc29yZGVycyRtZWFuX2VhdGluZ19kaXNvcmRlcnMgPC0gbG9nKGVhdGluZ19kaXNvcmRlcnMkbWVhbl9lYXRpbmdfZGlzb3JkZXJzKQoKIyBTY2FsZSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uIChpZiBuZWVkZWQpCmVhdGluZ19kaXNvcmRlcnMkbWVhbl9lYXRpbmdfZGlzb3JkZXJzIDwtIHNjYWxlKGVhdGluZ19kaXNvcmRlcnMkbWVhbl9lYXRpbmdfZGlzb3JkZXJzKQoKIyBQcmludCB0aGUgcmVzdWx0aW5nIGRhdGEgZnJhbWUKcHJpbnQoZWF0aW5nX2Rpc29yZGVycykKCmBgYApgYGB7cn0KIyMjIyMjIyNCaXBvbGFyIGRpc29yZGVyIyMjIyMjIyMjCmJpcG9sYXJfZGlzb3JkZXIgPC0gZ2JkX21lbnRhbGhlYWx0aCAlPiUKICBmaWx0ZXIoY2F1c2UgPT0gIkJpcG9sYXIgZGlzb3JkZXIiKQoKIyBDYWxjdWxhdGUgdGhlIG1lYW4gb2YgJ3ZhbCcgKERBTFlzKSBhY3Jvc3MgYWxsIGxvY2F0aW9ucwptZWFuX0RBTFlzIDwtIG1lYW4oYmlwb2xhcl9kaXNvcmRlciR2YWwpCgojIE9wdGlvbmFsbHksIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnkKYmlwb2xhcl9kaXNvcmRlciA8LSBiaXBvbGFyX2Rpc29yZGVyICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIHN1bW1hcmlzZShtZWFuX2JpcG9sYXJfZGlzb3JkZXIgPSBtZWFuKHZhbCkpCgojIExvZyB0cmFuc2Zvcm0gdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbgpiaXBvbGFyX2Rpc29yZGVyJG1lYW5fYmlwb2xhcl9kaXNvcmRlciA8LSBsb2coYmlwb2xhcl9kaXNvcmRlciRtZWFuX2JpcG9sYXJfZGlzb3JkZXIpCgojIFNjYWxlIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4gKGlmIG5lZWRlZCkKYmlwb2xhcl9kaXNvcmRlciRtZWFuX2JpcG9sYXJfZGlzb3JkZXIgPC0gc2NhbGUoYmlwb2xhcl9kaXNvcmRlciRtZWFuX2JpcG9sYXJfZGlzb3JkZXIpCgojIFByaW50IHRoZSByZXN1bHRpbmcgZGF0YSBmcmFtZQpwcmludChiaXBvbGFyX2Rpc29yZGVyKQoKYGBgCmBgYHtyfQpwcmludChjYXVzZV90YWJsZSkKYGBgCmBgYHtyfQojIyMjIyMjI1N1YnN0YW5jZSB1c2UgZGlzb3JkZXJzIyMjIyMjIyMKCnN1YnN0YW5jZV91c2VfZGlzb3JkZXJzIDwtIGdiZF9tZW50YWxoZWFsdGggJT4lCiAgZmlsdGVyKGNhdXNlID09ICJTdWJzdGFuY2UgdXNlIGRpc29yZGVycyIpCgojIENhbGN1bGF0ZSB0aGUgbWVhbiBvZiAndmFsJyAoREFMWXMpIGFjcm9zcyBhbGwgbG9jYXRpb25zCm1lYW5fREFMWXMgPC0gbWVhbihzdWJzdGFuY2VfdXNlX2Rpc29yZGVycyR2YWwpCgojIE9wdGlvbmFsbHksIGNhbGN1bGF0ZSBtZWFuIGJ5IGNvdW50cnkKc3Vic3RhbmNlX3VzZV9kaXNvcmRlcnMgPC0gc3Vic3RhbmNlX3VzZV9kaXNvcmRlcnMgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgc3VtbWFyaXNlKG1lYW5fc3Vic3RhbmNlX3VzZV9kaXNvcmRlcnMgPSBtZWFuKHZhbCkpCgojIExvZyB0cmFuc2Zvcm0gdGhlIG1lYW5fYnVsaW1pYV9uZXJ2b3NhIGNvbHVtbgpzdWJzdGFuY2VfdXNlX2Rpc29yZGVycyRtZWFuX3N1YnN0YW5jZV91c2VfZGlzb3JkZXJzIDwtIGxvZyhzdWJzdGFuY2VfdXNlX2Rpc29yZGVycyRtZWFuX3N1YnN0YW5jZV91c2VfZGlzb3JkZXJzKQoKIyBTY2FsZSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uIChpZiBuZWVkZWQpCnN1YnN0YW5jZV91c2VfZGlzb3JkZXJzJG1lYW5fc3Vic3RhbmNlX3VzZV9kaXNvcmRlcnMgPC0gc2NhbGUoc3Vic3RhbmNlX3VzZV9kaXNvcmRlcnMkbWVhbl9zdWJzdGFuY2VfdXNlX2Rpc29yZGVycykKCiMgUHJpbnQgdGhlIHJlc3VsdGluZyBkYXRhIGZyYW1lCnByaW50KHN1YnN0YW5jZV91c2VfZGlzb3JkZXJzKQoKYGBgCmBgYHtyfQojIyMjRHJ1ZyB1c2UgZGlzb3JkZXJzCgpkcnVnX3VzZV9kaXNvcmRlcnMgPC0gZ2JkX21lbnRhbGhlYWx0aCAlPiUKICBmaWx0ZXIoY2F1c2UgPT0gIkRydWcgdXNlIGRpc29yZGVycyIpCgojIENhbGN1bGF0ZSB0aGUgbWVhbiBvZiAndmFsJyAoREFMWXMpIGFjcm9zcyBhbGwgbG9jYXRpb25zCm1lYW5fREFMWXMgPC0gbWVhbihkcnVnX3VzZV9kaXNvcmRlcnMkdmFsKQoKIyBPcHRpb25hbGx5LCBjYWxjdWxhdGUgbWVhbiBieSBjb3VudHJ5CmRydWdfdXNlX2Rpc29yZGVycyA8LSBkcnVnX3VzZV9kaXNvcmRlcnMgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgc3VtbWFyaXNlKG1lYW5fZHJ1Z191c2VfZGlzb3JkZXJzID0gbWVhbih2YWwpKQoKIyBMb2cgdHJhbnNmb3JtIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4KZHJ1Z191c2VfZGlzb3JkZXJzJG1lYW5fZHJ1Z191c2VfZGlzb3JkZXJzIDwtIGxvZyhkcnVnX3VzZV9kaXNvcmRlcnMkbWVhbl9kcnVnX3VzZV9kaXNvcmRlcnMpCgojIFNjYWxlIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4gKGlmIG5lZWRlZCkKZHJ1Z191c2VfZGlzb3JkZXJzJG1lYW5fZHJ1Z191c2VfZGlzb3JkZXJzIDwtIHNjYWxlKGRydWdfdXNlX2Rpc29yZGVycyRtZWFuX2RydWdfdXNlX2Rpc29yZGVycykKCiMgUHJpbnQgdGhlIHJlc3VsdGluZyBkYXRhIGZyYW1lCnByaW50KGRydWdfdXNlX2Rpc29yZGVycykKCgpgYGAKYGBge3J9CiMjIyMjIyMjIyNBbGNvaG9sIHVzZSBkaXNvcmRlcnMKYWxjb2hvbF91c2VfZGlzb3JkZXJzIDwtIGdiZF9tZW50YWxoZWFsdGggJT4lCiAgZmlsdGVyKGNhdXNlID09ICJBbGNvaG9sIHVzZSBkaXNvcmRlcnMiKQoKIyBDYWxjdWxhdGUgdGhlIG1lYW4gb2YgJ3ZhbCcgKERBTFlzKSBhY3Jvc3MgYWxsIGxvY2F0aW9ucwptZWFuX0RBTFlzIDwtIG1lYW4oYWxjb2hvbF91c2VfZGlzb3JkZXJzJHZhbCkKCiMgT3B0aW9uYWxseSwgY2FsY3VsYXRlIG1lYW4gYnkgY291bnRyeQphbGNvaG9sX3VzZV9kaXNvcmRlcnMgPC0gYWxjb2hvbF91c2VfZGlzb3JkZXJzICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIHN1bW1hcmlzZShtZWFuX2FsY29ob2xfdXNlX2Rpc29yZGVycyA9IG1lYW4odmFsKSkKCiMgTG9nIHRyYW5zZm9ybSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uCmFsY29ob2xfdXNlX2Rpc29yZGVycyRtZWFuX2FsY29ob2xfdXNlX2Rpc29yZGVycyA8LSBsb2coYWxjb2hvbF91c2VfZGlzb3JkZXJzJG1lYW5fYWxjb2hvbF91c2VfZGlzb3JkZXJzKQoKIyBTY2FsZSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uIChpZiBuZWVkZWQpCmFsY29ob2xfdXNlX2Rpc29yZGVycyRtZWFuX2FsY29ob2xfdXNlX2Rpc29yZGVycyA8LSBzY2FsZShhbGNvaG9sX3VzZV9kaXNvcmRlcnMkbWVhbl9hbGNvaG9sX3VzZV9kaXNvcmRlcnMpCgojIFByaW50IHRoZSByZXN1bHRpbmcgZGF0YSBmcmFtZQpwcmludChhbGNvaG9sX3VzZV9kaXNvcmRlcnMpCgpgYGAKYGBge3J9CiMjIyMjIyNNYWpvciBkZXByZXNzaXZlIGRpc29yZGVycwptYWpvcl9kZXByZXNzaXZlX2Rpc29yZGVyIDwtIGdiZF9tZW50YWxoZWFsdGggJT4lCiAgZmlsdGVyKGNhdXNlID09ICJNYWpvciBkZXByZXNzaXZlIGRpc29yZGVyIikKCiMgQ2FsY3VsYXRlIHRoZSBtZWFuIG9mICd2YWwnIChEQUxZcykgYWNyb3NzIGFsbCBsb2NhdGlvbnMKbWVhbl9EQUxZcyA8LSBtZWFuKG1ham9yX2RlcHJlc3NpdmVfZGlzb3JkZXIkdmFsKQoKIyBPcHRpb25hbGx5LCBjYWxjdWxhdGUgbWVhbiBieSBjb3VudHJ5Cm1ham9yX2RlcHJlc3NpdmVfZGlzb3JkZXIgPC0gbWFqb3JfZGVwcmVzc2l2ZV9kaXNvcmRlciAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBzdW1tYXJpc2UobWVhbl9tYWpvcl9kZXByZXNzaXZlX2Rpc29yZGVyID0gbWVhbih2YWwpKQoKIyBMb2cgdHJhbnNmb3JtIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4KbWFqb3JfZGVwcmVzc2l2ZV9kaXNvcmRlciRtZWFuX21ham9yX2RlcHJlc3NpdmVfZGlzb3JkZXIgPC0gbG9nKG1ham9yX2RlcHJlc3NpdmVfZGlzb3JkZXIkbWVhbl9tYWpvcl9kZXByZXNzaXZlX2Rpc29yZGVyKQoKIyBTY2FsZSB0aGUgbWVhbl9idWxpbWlhX25lcnZvc2EgY29sdW1uIChpZiBuZWVkZWQpCm1ham9yX2RlcHJlc3NpdmVfZGlzb3JkZXIkbWVhbl9tYWpvcl9kZXByZXNzaXZlX2Rpc29yZGVyIDwtIHNjYWxlKG1ham9yX2RlcHJlc3NpdmVfZGlzb3JkZXIkbWVhbl9tYWpvcl9kZXByZXNzaXZlX2Rpc29yZGVyKQoKIyBQcmludCB0aGUgcmVzdWx0aW5nIGRhdGEgZnJhbWUKcHJpbnQobWFqb3JfZGVwcmVzc2l2ZV9kaXNvcmRlcikKCmBgYApgYGB7cn0KIyMjIyMjI0R5c3RoeW1pYSMjIyMjIyMjCgpkeXN0aHltaWEgPC0gZ2JkX21lbnRhbGhlYWx0aCAlPiUKICBmaWx0ZXIoY2F1c2UgPT0gIkR5c3RoeW1pYSIpCgojIENhbGN1bGF0ZSB0aGUgbWVhbiBvZiAndmFsJyAoREFMWXMpIGFjcm9zcyBhbGwgbG9jYXRpb25zCm1lYW5fREFMWXMgPC0gbWVhbihkeXN0aHltaWEkdmFsKQoKIyBPcHRpb25hbGx5LCBjYWxjdWxhdGUgbWVhbiBieSBjb3VudHJ5CmR5c3RoeW1pYSA8LSBkeXN0aHltaWEgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgc3VtbWFyaXNlKG1lYW5fZHlzdGh5bWlhID0gbWVhbih2YWwpKQoKIyBMb2cgdHJhbnNmb3JtIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4KZHlzdGh5bWlhJG1lYW5fZHlzdGh5bWlhIDwtIGxvZyhkeXN0aHltaWEkbWVhbl9keXN0aHltaWEpCgojIFNjYWxlIHRoZSBtZWFuX2J1bGltaWFfbmVydm9zYSBjb2x1bW4gKGlmIG5lZWRlZCkKZHlzdGh5bWlhJG1lYW5fZHlzdGh5bWlhIDwtIHNjYWxlKGR5c3RoeW1pYSRtZWFuX2R5c3RoeW1pYSkKCiMgUHJpbnQgdGhlIHJlc3VsdGluZyBkYXRhIGZyYW1lCnByaW50KGR5c3RoeW1pYSkKCgpgYGAKYGBge3J9CmxpYnJhcnkoZHBseXIpCgojIFBlcmZvcm0gbGVmdCBqb2lucyBmb3IgZWFjaCBkYXRhIGZyYW1lIG9uICdjb3VudHJ5JwpmaW5hbF9tZW50YWxfaGVhbHRoX2luZGV4IDwtIG1lbnRhbF9oZWFsdGhfaW5kZXggJT4lCiAgbGVmdF9qb2luKGJ1bGltaWFfbmVydm9zYSwgYnkgPSAiY291bnRyeSIpICU+JQogIGxlZnRfam9pbihBREhELCBieSA9ICJjb3VudHJ5IikgJT4lCiAgbGVmdF9qb2luKElkaW9wYXRoaWNfZGV2ZWxvcG1lbnRhbF9pbnRlbGxlY3R1YWxfZGlzYWJpbGl0eSwgYnkgPSAiY291bnRyeSIpICU+JQogIGxlZnRfam9pbihhbm9yZXhpYV9uZXJ2b3NhLCBieSA9ICJjb3VudHJ5IikgJT4lCiAgbGVmdF9qb2luKGRlcHJlc3NpdmVfZGlzb3JkZXJzLCBieSA9ICJjb3VudHJ5IikgJT4lCiAgbGVmdF9qb2luKGF1dGlzbXVzX3NwZWN0cnVtX2Rpc29yZGVycywgYnkgPSAiY291bnRyeSIpICU+JQogIGxlZnRfam9pbihjb25kdWN0X2Rpc29yZGVycywgYnkgPSAiY291bnRyeSIpICU+JQogIGxlZnRfam9pbihzY2hpem9waHJlbmlhLCBieSA9ICJjb3VudHJ5IikgJT4lCiAgbGVmdF9qb2luKGVhdGluZ19kaXNvcmRlcnMsIGJ5ID0gImNvdW50cnkiKSAlPiUKICBsZWZ0X2pvaW4oYmlwb2xhcl9kaXNvcmRlciwgYnkgPSAiY291bnRyeSIpICU+JQogIGxlZnRfam9pbihkcnVnX3VzZV9kaXNvcmRlcnMsIGJ5ID0gImNvdW50cnkiKSAlPiUKICBsZWZ0X2pvaW4oYWxjb2hvbF91c2VfZGlzb3JkZXJzLCBieSA9ICJjb3VudHJ5IikgJT4lCiAgbGVmdF9qb2luKHN1YnN0YW5jZV91c2VfZGlzb3JkZXJzLCBieSA9ICJjb3VudHJ5IikgJT4lCiAgbGVmdF9qb2luKG1ham9yX2RlcHJlc3NpdmVfZGlzb3JkZXIsIGJ5ID0gImNvdW50cnkiKSAlPiUKICBsZWZ0X2pvaW4oZHlzdGh5bWlhLCBieSA9ICJjb3VudHJ5IikKCiMgRGlzcGxheSB0aGUgcmVzdWx0aW5nIGRhdGEgZnJhbWUKcHJpbnQoZmluYWxfbWVudGFsX2hlYWx0aF9pbmRleCkKCiMgU2hvdyB0aGUgZmlyc3QgZmV3IHJvd3Mgb2YgdGhlIHJlc3VsdGluZyBkYXRhIGZyYW1lCmhlYWQoZmluYWxfbWVudGFsX2hlYWx0aF9pbmRleCkKCmBgYApgYGB7cn0KaW5kaWNhdG9ycyA8LSBsZWZ0X2pvaW4oZmluYWxfbWVudGFsX2hlYWx0aF9pbmRleCwgaGFyZHNoaXAsIGJ5ID0gImNvdW50cnkiKQppbmRpY2F0b3JzCmhlYWQoaW5kaWNhdG9ycykKCm5ld19kYXRhIDwtIGxlZnRfam9pbiAoV1ZTX2RhdGEsIGluZGljYXRvcnMsIGJ5ID0gImNvdW50cnkiKQpuZXdfZGF0YQoKCiMgVHJhbnNmcm9tIHJpc2sgaXRlbSBzdWNoIHRoYXQgaGlnaCB2YWx1ZXMgcmVwcmVzZW50IG1vcmUgcmlzayB0YWtpbmcKbmV3X2RhdGEkcmlza3Rha2luZyA9IDYgLSBuZXdfZGF0YSRyaXNrdGFraW5nICsgMQoKICAKIyBUcmFuc2Zvcm0gcmlzayB2YXJpYWJsZSBpbnRvIFQtc2NvcmUgKG1lYW4gPSA1MCwgc2QgPSAxMCkKbmV3X2RhdGEkVF9zY29yZV9yaXNrdGFraW5nID0gMTAqc2NhbGUobmV3X2RhdGEkcmlza3Rha2luZywgY2VudGVyPVRSVUUsc2NhbGU9VFJVRSkrNTAKCm5ld19kYXRhCgojVHJhbnNmb3JtIHJpc2sgdmFyaWFibGUgaW50byBaIHNjb3JlIAoKIyBBc3N1bWluZyBULXNjb3JlcyBoYXZlIGEgbWVhbiBvZiA1MCBhbmQgYSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgMTAKbmV3X2RhdGEkWl9zY29yZV9yaXNrdGFraW5nID0gKG5ld19kYXRhJFRfc2NvcmVfcmlza3Rha2luZyAtIDUwKSAvIDEwCgojIFByaW50IHRoZSByZXN1bHRpbmcgZGF0YSBmcmFtZQpwcmludChuZXdfZGF0YSkKCm5ld19kYXRhIDwtIG5ld19kYXRhICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIG11dGF0ZSh6X3Njb3JlX2FnZSA9IHNjYWxlKGFnZSkpCm5ld19kYXRhCmBgYApgYGB7cn0KbGlicmFyeShsbWU0KQoKbGlicmFyeShsbWU0KQoKbW9kZWwgPC0gbG1lcihUX3Njb3JlX3Jpc2t0YWtpbmcgfiBzY2FsZSh6X3Njb3JlX2FnZSkgKiBtZW50YWxfaGVhbHRoICsKICAgICAgICAgICAgICAgZ2VuZGVyICogbWVudGFsX2hlYWx0aCArCiAgICAgICAgICAgICAgIGZhY3RvcihtYXJyaWVkKSArIGZhY3RvcihjaGlsZHJlbikgKwogICAgICAgICAgICAgICBmYWN0b3IoZWR1Y2F0aW9uKSArIGZhY3RvcihlbXBsb3llZCkgKwogICAgICAgICAgICAgICAoMSArIHNjYWxlKHpfc2NvcmVfYWdlKSArIGZhY3RvcihtYXJyaWVkKSArIGZhY3RvcihjaGlsZHJlbikgKyAKICAgICAgICAgICAgICAgIGZhY3RvcihlZHVjYXRpb24pICsgZmFjdG9yKGVtcGxveWVkKSB8IGNvdW50cnkpLAogICAgICAgICAgICAgZGF0YSA9IG5ld19kYXRhLCBjb250cm9sID0gbG1lckNvbnRyb2wob3B0aW1pemVyID0gImJvYnlxYSIsIG9wdEN0cmwgPSBsaXN0KG1heGZ1biA9IDEwMDAwMCkpKQoKCnN1bW1hcnkobW9kZWwpCgojIEFzc3VtaW5nICdtb2RlbCcgaXMgYSBsaW5lYXIgbWl4ZWQtZWZmZWN0cyBtb2RlbCAobG1lciksIGFuZCB5b3Ugd2FudCB0byBzYXZlIGNvZWZmaWNpZW50cyB0byBhIENTViBmaWxlCgojIEV4dHJhY3QgY29lZmZpY2llbnRzIGZyb20gdGhlIG1vZGVsIHN1bW1hcnkKY29lZmZpY2llbnRzX2RmIDwtIGRhdGEuZnJhbWUoc3VtbWFyeShtb2RlbCkkY29lZmZpY2llbnRzKQoKIyBXcml0ZSBjb2VmZmljaWVudHMgdG8gYSBDU1YgZmlsZQp3cml0ZS5jc3YoY29lZmZpY2llbnRzX2RmLCAibW9kZWxfY29lZmZpY2llbnRzLmNzdiIsIHJvdy5uYW1lcyA9IFRSVUUpCgpgYGAKYGBge3J9CgpgYGAKCgpgYGAKCgoK
>>>>>>> 4479a7ab7bae21012b85ea8788a321584f71e429